IOS 8 - Вращение приводит к тому, что statusBar исчезает даже в портретном режиме после переключения элементов управления
У меня много проблем с новым автоматическим скрытием строки состояния в iOS 8.
В моем приложении у меня есть вид, в котором, когда пользователь нажимает один раз, панель навигации и строка состояния исчезают.
Когда в ландшафте, строка состояния прячется сама по себе, и это хорошо для меня. Мне это нужно только в портретном режиме.
Но проблема в том, что когда устройство находится в горизонтальной ориентации и отображается полоса, когда пользователь дважды нажимает, чтобы переключить панель (отображая ее), и переключает устройство в портретный режим, строка состояния все еще скрыта.
По сути, мне нужно иметь возможность скрывать строку состояния без вмешательства в ее естественное поведение на iOS 8, поэтому я повторю сценарий:
- Пользователь входит в указанное представление с tabBar и NavigationBar и statusBar;
- Один раз нажмите на изображение, и полосы исчезнут.
- Пользователь поворачивает устройство, панель состояния не отображается - ОК, я хочу это
- Пользователь снова нажимает, чтобы отобразить панели - StatusBar все еще скрыт, хорошо.
- Пользователь поворачивается от пейзажа к портрету и..
- StatusBar все еще скрыт - НЕ ОК.
MRW> ![]()
(источник: mshcdn.com)
Я попытался настроить статус-бар на willRotate, но я сделал беспорядок, в котором статус-бар будет виден, когда он не должен был. Код, который я использую:
- (BOOL)prefersStatusBarHidden
{
return statusBarHidden;
}
-(void)toggleBars:(UITapGestureRecognizer *)gesture{
CATransition *animation = [CATransition animation];
animation.type = kCATransitionFromBottom;
animation.subtype = kCATransitionFromTop;
animation.duration = .2f;
[animation setTimingFunction:[CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut]];
BOOL toggleNavigationBar = self.navigationController.navigationBarHidden;
[self.navigationController.navigationBar.layer addAnimation:animation forKey:nil];
[self.navigationController setNavigationBarHidden:!toggleNavigationBar animated:YES];
BOOL toggleTabHidden = self.tabBarController.tabBar.hidden;
if(![[[NSUserDefaults standardUserDefaults] objectForKey:@"showTabBar"]isKindOfClass:[NSNull class]]){
if([(NSNumber*)[[NSUserDefaults standardUserDefaults] objectForKey:@"showTabBar"]boolValue])
{
[self.tabBarController.tabBar.layer addAnimation:animation forKey:nil];
[self.tabBarController setHideTabBar:!toggleTabHidden animated:YES];
}
}
statusBarHidden = [UIApplication sharedApplication].statusBarHidden;
[[UIApplication sharedApplication] setStatusBarHidden:!statusBarHidden withAnimation:UIStatusBarAnimationSlide];
[self setNeedsStatusBarAppearanceUpdate];
if (IS_IOS8){
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation)){
if (statusBarHidden){
[[UIApplication sharedApplication] setStatusBarHidden:YES];
}
}
}
}
Я думал о том, чтобы установить флаг, в котором, когда statusBar скрыт, когда в альбомной ориентации присутствуют все элементы управления, при вращении он будет запускать statusBar. Безуспешно, по-видимому..
Любая помощь высоко ценится.
Ответы
Ответ 1
Вы используете внешний вид строки состояния на основе UIViewController?
Если вы реализуете prefersStatusBarHidden
, я предполагаю, что вы.
Теперь
[[UIApplication sharedApplication] setStatusBarHidden:!statusBarHidden withAnimation: UIStatusBarAnimationSlide];
не предполагается работать с появлением строки состояния на основе UIViewController.
Вам нужно просто вернуть другое значение из метода prefersStatusBarHidden
и вызвать setNeedsStatusBarAppearanceUpdate
, чтобы уведомить приложение о том, что возвращаемое значение изменилось.
Итак, чтобы изменить видимость строки состояния, вы должны просто сделать
@property (nonatomic, assign) BOOL hideStatusBar;
- (BOOL)prefersStatusBarHidden
{
return self.hideStatusBar;
}
- (void)toggleBars:(UITapGestureRecognizer *)gesture
{
... hide navbar and tabbar ...
self.hideStatusBar = ! self.hideStatusBar;
[self setNeedsStatusBarAppearanceUpdate];
}
И что это!
Ответ 2
Это сработало для меня:
- (void)viewWillLayoutSubviews {
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}
Ответ 3
Это быстрая (3.0) версия этого prefersStatusBarHidden
override var prefersStatusBarHidden: Bool{
return false
}
Вам просто нужно добавить его в свой ViewController
Ответ 4
#pragma mark After and Before Oriantation Change Methods+Delegate
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}
#pragma mark nav
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[[UIApplication sharedApplication] setStatusBarHidden:NO];
}
Это метод Short и Easy.