ios7 - uiviewcontroller显示状态栏 - uiviewcontroller隐藏状态栏




如何隐藏iOS状态栏 (14)

在我的iOS视频应用程序状态栏中隐藏了一些视图控制器。 我用下面的代码完成了这个。

[[UIApplication sharedApplication] setStatusBarHidden:YES];
  • 它适用于iOS 5和iOS 6,但不适用于iOS 7。

  • 我试图用这个特别的视图控制器,

例如:

-(BOOL)prefersStatusBarHidden { return YES; }

它工作正常,但我不能在父视图控制器中再次显示状态栏。


试试这个简单的方法:

Objective-C的:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated]
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated]
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
}

迅速:

override func viewWillAppear(animated: Bool) 
{
    super.viewWillAppear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: UIStatusBarAnimation.None)
}

override func viewWillDisappear(animated: Bool) 
{
    super.viewWillDisappear(animated)
    UIApplication.sharedApplication().setStatusBarHidden(false, withAnimation: UIStatusBarAnimation.None)
}

Swift 3的更新:

用以下信息更新Info.plist:

View controller-based status bar appearance: NO

然后,在ViewController或其他地方:

UIApplication.shared.isStatusBarHidden = true


SWIFT 3+(iOS 9,10)的固定解决方案

1-在info.plist下面设置属性

2-将以下代码粘贴到根控制器,至

 private var isStatusBarHidden = true {
        didSet {
            setNeedsStatusBarAppearanceUpdate()
        }
    }

    override var prefersStatusBarHidden: Bool {
        return isStatusBarHidden
    }

你可以调用isStatusBarHidden = trueisStatusBarHidden = false你想hide/show状态栏的地方


iOS 9以上:

由于statusBarHidden方法从iOS9弃用因此您需要在plist中添加两个值,如下所示:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

或通过用户界面请refre下面的图像:

由于statusBarHidden已从iOS9中 弃用

@property(readwrite,nonatomic,getter = isStatusBarHidden)BOOL statusBarHidden NS_ DEPRECATED _IOS( 2_0,9_0 ,“Use - [UIViewController prefersStatusBarHidden]”)__TVOS_PROHIBITED;


为了更好的理解,添加一些带有评论的照

在任何更改之前的应用

在名为Supporting Files Project Navigator文件夹中找到,然后单击* .plist文件

之后你会得到不同的应用程序显示设置。 你需要添加2个键UIStatusBarHiddenUIViewControllerBasedStatusBarAppearance 。 您只需点击+按钮即可完成此操作

按下+之后,您可以选择其中一个键 - 只需开始键入即可。

正确版本:

最后在应用此更改后应用:

另外,您可以here找到替代解决方案


UIKit > UIApplication.h

// Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
@property(nonatomic,getter=isStatusBarHidden) BOOL statusBarHidden;
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation NS_AVAILABLE_IOS(3_2);

所以应该将View controller-based status bar appearance为NO


在iOS10中,我需要做的是覆盖我的RootViewController (Swift)中的prefersStatusBarHidden var:

override var prefersStatusBarHidden: Bool {
    return true
}

在iOS7中隐藏状态栏:

打开您的plist文件,然后添加一个名为“基于视图控制器的状态栏外观”的添加行并将其值设置为NO


将以下内容添加到您的Info.plist中:

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>


尝试一下;

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

您应该将此值添加到plist:“查看基于控制器的状态栏外观”并将其设置为“NO”。


我做了以下,它似乎工作(即使在iOS 8中):

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {

        [[UIApplication sharedApplication] setStatusBarHidden:YES];
    }
}

- (BOOL)prefersStatusBarHidden {
    return YES;
}

要在iOS7中隐藏状态栏,您需要2行代码

  1. 在应用程序中:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions write

     [[UIApplication sharedApplication] setStatusBarHidden:YES];
    
  2. 在info.plist中添加这个

     View-Controller Based Status Bar Appearance = NO
    

  • UIApplication.setStatusBarX从iOS9开始已弃用
  • 在你的info.plist中已经弃用了UIViewControllerBasedStatusBarAppearance = NO
  • 所以我们应该在我们所有的视图控制器中使用preferredStatusBarX

但是当涉及到一个UINavigationController时它会变得更有趣:

  • 如果navigationBarHidden = true,则调用子UIViewController的preferredStatusBarX,因为子级正在状态栏下显示内容。
  • 如果navigationBarHidden = false,则会调用UINavigationController的preferredStatusBarX,毕竟它在状态栏下显示内容。
  • UINavigationController的默认preferredStatusBarStyle使用UINav.navigationBar.barStyle中的值。 .Default =黑色状态栏内容,.Black =白色状态栏内容。
  • 因此,如果您将barTintColor设置为某种自定义颜色(您可能是),则还需要将barStyle设置为.Black以获取白色状态栏内容。 在设置barTintColor之前,我会将barStyle设置为黑色,以防barStyle覆盖barTintColor。
  • 另一种方法是,您可以继承UINavigationController而不是使用bar风格。
  • 但是,如果您继承了UINavigationController,那么如果navigationBarHidden = true,则无法控制状态栏。 不知何故,在这种情况下,UIKit会直接转到子UIViewController,而不会询问UINavigationController。 我原以为它应该是UINavigationController的责任,要求孩子>耸肩<。
  • 并且模态显示的UIViewController的只有在状态栏中才有发言权,如果modalPresentationStyle = .FullScreen。
  • 如果您有自定义的演示样式模式视图控制器,并且您确实希望它控制状态栏,则可以设置modalPresentationCapturesStatusBarAppearance = true。




statusbar