2015-02-04 4 views
1

Я добавляю пользовательскую строку состояния 20px 'над UINavigationBar. Строка состояния отобразит ярлык «Обновление», когда пользователь потянет, чтобы обновить. При нормальной работе отображается строка состояния по умолчанию, затем я вызываю setStatusBarHidden:withAnimation:, чтобы погасить строку состояния по умолчанию и открыть за ней строку состояния.Пользовательская строка состояния выше UINavigationBar

Моя проблема в том, что когда я скрываю строку состояния по умолчанию, панель навигации перемещается на 20 пикселей и перекрывает пользовательскую строку состояния!

Есть ли способ заставить UINavigationBar оставаться в одном месте?

+1

Да, но для этого потребуется управление навигационной панелью или viewController. Другой вариант, который некоторые используют вместо того, чтобы скрывать statusBar, создает над ним новый UIWindow с вашим наложением. Это может быть более плавный вариант –

ответ

1

Хорошо! Таким образом, решение (как это было предложено Райан) было создать UIWindow и установить:

self.overlayWindow.windowLevel = UIWindowLevelStatusBar; 

Это создает окно, которое находится над строкой состояния. Я не понимал, что вы можете показывать несколько UIWindows в любой момент. Это невероятно элегантное решение.

Некоторые подводные камни:

  • Набор self.overlayWindow.hidden = NO. По умолчанию скрыты новые окна.
  • do необходимо установить контроллер корневого представления для нового окна.
  • Вам не нужно необходимо позвонить makeKeyAndVisible ... Установка self.overlayWindow.hidden = NO достаточно.
  • Вы можете добавить UIView subviews непосредственно на UIWindow.
  • Вы должны держать ссылку на self.overlayWindow. Если он освобождается, то UIWindow исчезнет (так как он не добавляется в качестве подвид или сохранить в другом месте):

    @property (nonatomic, strong) UIWindow *overlayWindow; 
    
  • Адаптация для вращения может занять немного дополнительной работы.

Мне было немного весело и создал класс, который подклассифицировал UIWindow и инкапсулировал настройку. В Swift:

class StatusBarOverlay: UIWindow { 

    init(frame: CGRect) { 
     super.init(frame: frame) 

     self.windowLevel = UIWindowLevelStatusBar 
     self.hidden = false 
     self.userInteractionEnabled = false 
    } 
} 
Смежные вопросы