自定义的Present Modal在IOS7.x下不会自动更新系统状态栏
2015-10-19 23:43
489 查看
自定义 Present/Dismiss 动画部分请参考上一篇:定制Segue
- OverlaySegue
在ios8/9上,OverlaySegue弹出目标视图控制器后,系统状态栏自动更新为新的样式,presented view controller如下配置
使用Ios7真机测试后,发现状态栏还是保持着源视图控制器(presenting view controller)的样式,几经折腾后找到解决方案
IOS7机型上这一行代码即可解决问题,从调用栈的相似度来看,修改后基本保持了同样的行为
IOS9调用栈
IOS7调用栈
API文档对modalPresentationCapturesStatusBarAppearance的说明中,默认值就是NO,暂时没弄清楚为什么新系统版本下,明明说了状态栏样式不由弹出视图控制器决定,但却那么做了。
系统默认的present modal弹出方式是没有这个问题的,我的OverlaySegue有点特殊,源视图控制器和目标视图控制器同时存在,目标视图覆盖在源视图上面,也就是说源视图没有从window中移除,有时间再细究。
- OverlaySegue
在ios8/9上,OverlaySegue弹出目标视图控制器后,系统状态栏自动更新为新的样式,presented view controller如下配置
- (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
使用Ios7真机测试后,发现状态栏还是保持着源视图控制器(presenting view controller)的样式,几经折腾后找到解决方案
- (void)perform { self.destinationViewController.transitioningDelegate = self.transitioningDelegate; self.destinationViewController.modalPresentationStyle = UIModalPresentationCustom; self.destinationViewController.modalPresentationCapturesStatusBarAppearance = YES; [self.sourceViewController presentViewController:self.destinationViewController animated:YES completion:NULL]; }
IOS7机型上这一行代码即可解决问题,从调用栈的相似度来看,修改后基本保持了同样的行为
modalPresentationCapturesStatusBarAppearance = YES
IOS9调用栈
-[ChildViewController preferredStatusBarStyle] -[UIApplication _updateCurrentStatusBarViewControllerAppearance] () -[UIViewController setNeedsStatusBarAppearanceUpdate] () -[UIViewController _setPresentedStatusBarViewController:] () -[_UIViewControllerTransitionCoordinator _applyBlocks:releaseBlocks:] () -[_UIViewControllerTransitionContext __runAlongsideAnimations] () -[UIViewAnimationState _runAlongsideAnimations] () -[UIViewAnimationState pop] () +[UIViewAnimationState popAnimationState] () +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:] () [UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:] () [TVOverlayAnimatedTransitioning animateTransition:]
IOS7调用栈
-[ChildViewController preferredStatusBarStyle] -[UIApplication _updateCurrentStatusBarViewControllerAppearance] () -[_UIViewControllerTransitionCoordinator _applyBlocks:releaseBlocks:] () -[_UIViewControllerTransitionContext __runAlongsideAnimations] () -[UIViewAnimationState _runAlongsideAnimations] () -[UIViewAnimationState pop] () +[UIViewAnimationState popAnimationState] () +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:] () +[UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:] () -[TVOverlayAnimatedTransitioning animateTransition:]
API文档对modalPresentationCapturesStatusBarAppearance的说明中,默认值就是NO,暂时没弄清楚为什么新系统版本下,明明说了状态栏样式不由弹出视图控制器决定,但却那么做了。
系统默认的present modal弹出方式是没有这个问题的,我的OverlaySegue有点特殊,源视图控制器和目标视图控制器同时存在,目标视图覆盖在源视图上面,也就是说源视图没有从window中移除,有时间再细究。
相关文章推荐
- ios开发设置navigationBar中显示成自定义图片同时不让push进去的子视图显示父视图中的图片
- iOS --- 使用openURL调用iOS系统应用
- ios移动开发navigationItem自带的返回按钮设置成自定义图片或者不显示父视图的标题文字
- iOS:实现MKAnnotation协议,在地图上设置大头针,点击显示具体的位置信息
- iOS—— 秒学远程推送
- ios开发如何让navigationItem自带的返回按钮设置成图片或者不显示文字
- iOS自定义相机界面
- IOS开发基础知识--碎片25
- iOS中ASI
- 回顾这一个月以来所学到的ios知识
- iOS 直播
- iOS8.1 编译ffmpeg和集成第三方实现直播(监控类)
- iOS:地图:MapKit和CoreLocation
- ios中的coredata的使用
- 使用IOS7原生API进行二维码条形码的扫描
- Xcode常用快捷键
- 刚把ios 环境做好 截个图庆祝一下
- IOS——MD5加密
- Block - 2
- ios程序开发中用到的加密方式