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.