如何在iOS7中使用淡入淡出效果切换状态栏(如照片应用)?

ann*_*nna 13 objective-c statusbar ios7

我想要点击状态栏的可见性,就像在照片应用中一样.

在iOS 7之前,此代码运行良好:

-(void)setStatusBarIsHidden:(BOOL)statusBarIsHidden {

    _statusBarIsHidden = statusBarIsHidden;

    if (statusBarIsHidden == YES) {

        [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];


    }else{

        [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];

    }

}
Run Code Online (Sandbox Code Playgroud)

但我无法让它在iOS 7中运行.我发现的所有答案都只提供永久隐藏栏但不切换的建议.

然而,自照片以来必须有一种方法.

fol*_*ben 44

默认情况下,在iOS 7或更高版本上,要隐藏特定视图控制器的状态栏,请执行以下操作:

  1. 如果视图控制器,你要隐藏与正在模态呈现的状态栏和modalPresentationStyleUIModalPresentationFullScreen,手动设置modalPresentationCapturesStatusBarAppearanceYES呈现之前所提出的控制器(例如,-presentViewController:animated:completion或者-prepareForSegue:如果你使用故事板)
  2. -prefersStatusBarHidden在呈现的控制器中覆盖并返回适当的值
  3. 打电话setNeedsStatusBarAppearanceUpdate给提出的控制器

如果要为其外观或消失设置动画,请在动画块中执行第三步:

[UIView animateWithDuration:0.33 animations:^{
    [self setNeedsStatusBarAppearanceUpdate];
}];
Run Code Online (Sandbox Code Playgroud)

您还可以通过UIStatusBarAnimation-preferredStatusBarUpdateAnimation显示的控制器中返回适当的值来设置动画样式.

  • modalPresentationCapturesStatusBarAppearance救了我.很好的答案. (2认同)

coc*_*oco 7

首先View controller-based status bar appearance在Info.plist中设置为YES

此Swift示例显示了在按下按钮后如何使用动画切换StatusBar.

import UIKit

class ToggleStatusBarViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func prefersStatusBarHidden() -> Bool {
        return !UIApplication.sharedApplication().statusBarHidden
    }

    override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation {
        return UIStatusBarAnimation.Slide
    }

    @IBAction func toggleStatusBar(sender: UIButton) {
        UIView.animateWithDuration(0.5,
            animations: {
                self.setNeedsStatusBarAppearanceUpdate()
        })
    }
}
Run Code Online (Sandbox Code Playgroud)


Jus*_*son 5

我能够简化@ Jon的答案,并且仍然可以与iOS 7上的Photos应用程序区分开来.看起来像显示时的延迟更新是没有必要的.

- (IBAction)toggleUI:(id)sender {
    self.hidesUI = !self.hidesUI;

    CGRect barFrame = self.navigationController.navigationBar.frame;

    CGFloat alpha = (self.hidesUI) ? 0.0 : 1.0;
    [UIView animateWithDuration:0.33 animations:^{
        [self setNeedsStatusBarAppearanceUpdate];
        self.navigationController.navigationBar.alpha = alpha;
    }];

    self.navigationController.navigationBar.frame = CGRectZero;
    self.navigationController.navigationBar.frame = barFrame;
}

- (BOOL)prefersStatusBarHidden {
    return self.hidesUI;
}
Run Code Online (Sandbox Code Playgroud)


Gre*_*reg 1

解决此问题的方法取决于应用程序 plist 中“基于视图控制器的状态栏外观”设置的值。

如果“查看基于控制器的状态栏外观”NO在您的 plist 中,那么此代码应该可以工作:

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
Run Code Online (Sandbox Code Playgroud)

如果“基于视图控制器的状态栏外观”处于启用状态,请在视图控制器中添加以下方法:

- (BOOL) prefersStatusBarHidden {
    // I've hardcoded to YES here, but you can return a dynamic value to meet your needs for toggling
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

对于切换,当您想根据上述方法的值更改状态栏是否隐藏/显示时,您的视图控制器可以调用该setNeedsStatusBarAppearanceUpdate方法。