iOS顶部状态栏改变造成的bug解决

点击上方“iOS开发”,选择“置顶公众号”

关键时刻,第一时间送达!

640?wxfrom=5&wx_lazy=1

640?wx_fmt=gif&wxfrom=5&wx_lazy=1


最近遇到了这样一个bug,发现当状态栏改变(比如出现开启热点,另一个程序后台获取位置等)后,有些view会下移,而有些view不会下移,如果是底部的view下移后就会造成bug。于是我就探索了一下并做出总结。


状态栏的改变会造成哪些改变?


当状态栏出现后,当前视图的根view的frame会发生改变,它的y值会增加20,高度会减少20。而[UIScreen mainScreen].bounds[UIApplication sharedApplication].keyWindow.bounds这两个方法得到的frame是不会改变的(始终等于屏幕大小)。所以一不注意就很容易写出状态栏改变后会引起视图下移的bug。


状态栏出现的几种情况


  1. view创建的时候已经有状态栏

  2. view创建的时候没有状态栏,view显示完全后才出现状态栏


解决思路


最简单的办法就是使用autolayout进行约束,并且靠底部的视图一定要从底部进行约束,这样无论是第一种情况还是第二种情况都不会产生bug。或者使用autoresizing,即设置view.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


如果在不使用autolayout和autoresizingMask的情况下


  • view创建的时候已经有状态栏


这种情况就很简单,当我们写frame获取当前视图大小的时候不要使用[UIScreen mainScreen].bounds[UIApplication sharedApplication].keyWindow.bounds这两个方法,改为[UIApplication sharedApplication].keyWindow.rootViewController.view.bounds这样来获取,这样获取的结果就是当前有无状态栏的时候的视图尺寸。


  • view创建的时候没有状态栏,view显示完全后才出现状态栏


这种情况就是view已经创建后状态栏会动态改变这种情况,而我们写代码的时候为了避免出现bug也是必须要兼容这种情况的。这种情况除了前面说的用autolayout来创建视图,另一种方法就只能监听状态栏改变的通知了,并且在收到通知后去动态的调整。


一些建议


  1. 如果是要获取当前视图的大小(而不是屏幕尺寸),建议使用[UIApplication sharedApplication].keyWindow.rootViewController.view.bounds

  2. 靠底部的简单视图尽量使用autolayout或者autoresizing,并且从底部进行约束(这样完全可以避免bug)

  3. 如果是用frame创建的视图,并且视图靠近底部,一定要考虑状态栏改变后视图下移可能造成遮挡的情况,所以这时候就只能去监听通知并进行一下动态的改变或者使用autoresizing。




640?

  • 作者:Tamp__

  • 链接:https://www.jianshu.com/p/776b928faf05

  • iOS开发整理发布,转载请联系作者授权

640?wx_fmt=gif640?【点击成为Java大神】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值