• iOS开发——常见BUG——window决定程序的状态栏管理问题


    Xcode7升级之后遇到的问题
     
    问题一:
    老项目在Xcode6上运行没有任何问题,但在Xcode7上运行直接崩了!
    经过一波分析:
    发现是因为我顶部状态栏处添加了topWindow,用于处理TableView滚回顶部的业务逻辑,而在Xcode7中window必须要有根控制器,否则直接崩溃,那么只要给这个topWindow设置一个rootViewController,将TableView滚回顶部的代码写在这个控制器去处理即可,解决报错
     
    问题二:
    在设置rootViewController之后,清空topWindow和rootViewController背景颜色,发现状态栏又不见了?
    而且状态栏是否显示、颜色的设置在栈顶控制器(当前显示的控制器)根本无法设置?
     
    然后在当前的ViewController里实现prefersStatusBarHidden返回NO,发现没有效果(iOS7开始是由控制器决定是否显示)
    那是因为iOS9的状态栏显示隐藏是由最顶层window决定的(也就是我设置的优先级最高的顶部的topWindow)那么就要在window的rootViewController里设置不要隐藏
    状态栏隐藏问题解决
    同理可在rootViewController实现preferredStatusBarStyle设置状态栏字体颜色;
     
    其实解决状态栏问题也可以通过application设置,但是iOS9你会发现设置状态栏的方法都过期,也就是说苹果不推荐我们直接通过application来设置
     
    问题三:
    当我从一个控制器modal或者push出另一个控制器来,需要修改状态栏时又麻烦了,因为这个时候状态栏颜色和隐藏都是由顶部topWindow的rootViewController决定的
    解决方案一:用通知(传参数修改状态栏)
    解决方案二:用单例(设计比较简单,清晰)推荐使用这种方法
    因为这个topWindow只有一份,设计成单例,并且提供两个属性
    @property (nonatomic, assign) UIStatusBarStyle statusBarStyle;
    @property (nonatomic, assign) BOOL statusBarHidden;
    
    #pragma mark - 状态栏控制
    - (BOOL)prefersStatusBarHidden
    {
        return self.statusBarHidden;
    }
    
    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        return self.statusBarStyle;
    }
    
    #pragma mark - setter
    - (void)setStatusBarHidden:(BOOL)statusBarHidden
    {
        _statusBarHidden = statusBarHidden;
        [self setNeedsStatusBarAppearanceUpdate];
    }
    
    - (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle
    {
        _statusBarStyle = statusBarStyle;
        [self setNeedsStatusBarAppearanceUpdate];
    }
    以后在外部只要拿到单例对象设置他的属性就能修改状态栏了
     

    总结:

      在iOS6到iOS8时,我们设置app的状态栏样式,一般把info.plist里面设置了View controller- based status bar appearance为NO,默认为YES,来应用程序来管理。这样的话多window时,并不会有影响状态栏的样式,因为状态栏是由应用UIApplication来管理。

      到了iOS9之后,上面的配置就会就会报警告。对于一名看不得警告的程序员来说,这是很难受的。那么想要消除这些警告,就必须将View controller-based status bar appearance设置为YES(或删除这条配置,因为默认就为YES)。这样的话在单个window时不会出现问题,但是如果你的应用有多个window,且其它的window的显示级别比主window的级别高时就会出现问题。因为状态栏的管理默认是交给最上面那个window的根控制器来管理的。

  • 相关阅读:
    Android屏幕适配
    设计模式学习心得
    C语言中的作用域、链接属性与存储属性
    二级指针删除单向链表
    C++编程风格
    python中index、slice与slice assignment用法
    lua_pcall与lua_call之间的区别
    lua-C++ userdata使用
    lua中调用C++函数
    C++中为什么有时要使用extern "C"
  • 原文地址:https://www.cnblogs.com/chglog/p/4919247.html
Copyright © 2020-2023  润新知