Панель состояния iOS 7 прозрачна

В раскадровке в контроллере представления я попытался добавить панель навигации в строку состояния, запустив ее, она прозрачна и отображает ярлык, который должен быть размытым, например панель навигации.

enter image description here

Но при размещении одного и того же контроллера представлений, встроенного в контроллер просмотра навигации, нижнее фоновое изображение может быть размыто, что является моим намерением.

enter image description here

Каковы эти два разных результата? Что нужно сделать для первого метода для размытия строки состояния?

Спасибо!

Ответы

Ответ 1

В iOS 7 строка состояния прозрачна по умолчанию. Размывание, которое вы видите, когда панель навигации фактически создается навигационной панелью. Таким образом, чтобы создать эффект, который вы ищете без панели навигации, вам нужно поместить представление, создающее эффект размытия под строкой состояния.

Для справки добавьте свое представление в рамку, предоставленную:

CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];

Ответ 2

Я знаю, что это устарело, просто для справки, я решил это, установив self.navigationController.navigationBar.clipToBounds = NO

Ответ 3

Я не тестировал это полностью, но перейдите в свой файл plist и проверьте следующие настройки:

"Просмотр состояния панели управления на основе контроллера": если для этого параметра установлено значение "Да", он должен отображать строку состояния, которая является уникальной для каждого контроллера просмотра, которая может быть тем, что вам нужно.

"Стиль строки состояния": вы можете установить это в три разных стиля: непрозрачный черный, серый и прозрачный черный.

Сообщите мне, если бы это сработало для вас.

Ответ 4

UINavigationController будет изменять высоту своего UINavigationBar до 44 точек или 64 точки в зависимости от довольно странного и недокументированного набора ограничений. Если UINavigationController обнаруживает, что верхняя часть его ракурса визуально смежна с вершиной UIWindows, тогда он рисует свою навигационную панель высотой 64 точки. Если его верхний вид не соприкасается с вершиной UIWindows (даже если он выключен только одной точкой), то он рисует свою навигационную панель "традиционным" способом с высотой 44 точки. Эта логика выполняется UINavigationController, даже если несколько дочерних элементов находятся внутри иерархии контроллера представления вашего приложения. Невозможно предотвратить это поведение.

Похоже, вы позиционируете свою иерархию взглядов в первом примере, начиная с точки (0,20). Кроме того, это UIToolbar или UINavigationBar? Если это последний, почему вы используете его сам по себе и не используете его внутри UINavigationController?

Если вы не используете UINavigationController и вместо этого используете пользовательские контейнеры контроллера просмотра, вам нужно будет соответствующим образом разместить свои представления.

См. этот ответ для подробного объяснения.

Ответ 5

У меня есть аналогичный дизайн пользовательского интерфейса и основанный на ответе Мэт Холл и некоторая статья Я googled, я придумываю что-то вроде этого:

- (void)viewDidLoad {
  [super viewDidLoad];

  if (NSFoundationVersionNumber>NSFoundationVersionNumber_iOS_6_1) {
    CGRect statusBarFrame = [self.view convertRect: [UIApplication sharedApplication].statusBarFrame fromView: nil];
    UIToolbar *statusBarBackground = [[UIToolbar alloc] initWithFrame: statusBarFrame];
    statusBarBackground.barStyle = self.navBar.barStyle;
    statusBarBackground.translucent = self.navBar.translucent;
    statusBarBackground.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth;
    [self.view addSubview: statusBarBackground];
  }
}

Где self.navBar указывает на панель навигации, добавленную в раскадровку. Это необходимо только в том случае, если он работает на iOS7, поэтому я добавил это условие (мое приложение должно поддерживать iOS5).

Это работает как шарм.


альтернативный подход (принудительный размер строки состояния) также хорош:
- (void)viewDidLoad {
  [super viewDidLoad];

  if (NSFoundationVersionNumber>NSFoundationVersionNumber_iOS_6_1) {
    CGRect statusBarFrame = [self.view convertRect: [UIApplication sharedApplication].statusBarFrame fromView: nil];
    self.navBar.frame = CGRectUnion(statusBarFrame, self.navBar.frame);
  }
}


Я нашел другое решение, я думаю, что это лучший, поскольку он включает только раскадровку, и код не требуется.
  • Переключение раскадровки в режим 6.1 (просмотр как: iOS 6.1 и ранее) change view mode
  • Выберите проблемный UINavigationBar
  • в разделе размера добавьте 20 дельта-высоту в "iOS6/7 Deltas" correct size of navigation bar
  • Переключить режим просмотра в режим 7.0 (просмотреть как: iOS 7.0 и более поздние версии) и быть счастливым с результатом.

Ответ 6

когда вы встроите контроллер просмотра с контроллером навигационного представления, в это время вы увидите панель навигации ко всем контроллерам представлений, к которым вы нажимаете тот же контроллер. В вашем первом случае вы добавляете объект навигационной панели, указав, что вы можете выбрать контроллер просмотра из раскадровки, перейти на вкладку инспекторов атрибутов и выбрать их верхнюю панель в качестве полупрозрачной навигационной панели. enter image description here