web-dev-qa-db-ja.com

iOS 8-回転すると、コントロールを切り替えた後、ポートレートモードでもstatusBarが消えます

IOS8のステータスバーの新しい自動非表示に多くの問題があります。

私のアプリでは、ユーザーが1回タップすると、ナビゲーションバーとステータスバーが消えるビューがあります。

横向きの場合、ステータスバーは自動的に非表示になり、問題ありません。ポートレートモードでのみ必要です。

ただし、問題は、デバイスが横向きでバーが表示されている場合、ユーザーが2回タップしてバーを切り替え(表示中)、デバイスを縦向きモードにすると、ステータスバーが非表示のままになることです。

基本的に、iOS 8での自然な動作を妨げることなく、statusBarを非表示にできる必要があるため、シナリオを要約します。

  • ユーザーは、tabBarとNavigationBarおよびstatusBarを使用して上記のビューに入ります。
  • ビューを1回タップすると、バーが消えます
  • ユーザーがデバイスを回転させ、statusBarが表示されない-OK、これが欲しい
  • ユーザーがもう一度タップしてバーを表示します-StatusBarはまだ非表示です、OK。
  • ユーザーは横向きから縦向きに回転します。
  • statusBarはまだ非表示です-OKではありません。

MRW>
(出典: mshcdn.com

WillRotateでstatusBarを調整しようとしましたが、想定外のときにstatusBarが表示されるという混乱を引き起こしました。私が使用しているコード:

- (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がトリガーされるフラグを設定することを考えていました。どうやら成功しなかった。

どんな助けでも大歓迎です。

16
Phillip

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];
}

以上です!

27
hybridcattt

これは私のために働いた:

- (void)viewWillLayoutSubviews {
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}
6
#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];
}

これは短くて簡単な方法です。

0
Dipen Desai