您的位置:首页 > 移动开发 > IOS开发

自定义的Present Modal在IOS7.x下不会自动更新系统状态栏

2015-10-19 23:43 489 查看
自定义 Present/Dismiss 动画部分请参考上一篇:定制Segue
- 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中移除,有时间再细究。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: