Ios 交互式视图控制器解雇和更改statusBarStyle不兼容?
我正在演示一个带有交互式转换的模态Ios 交互式视图控制器解雇和更改statusBarStyle不兼容?,ios,cocoa-touch,uiviewcontroller,uikit,statusbar,Ios,Cocoa Touch,Uiviewcontroller,Uikit,Statusbar,我正在演示一个带有交互式转换的模态UINavigationController。父视图控制器有一个暗状态栏,而模态视图控制器有一个亮状态栏。我正在使用基于iOS 7 view controller的状态栏外观配置 只要我以非交互方式显示和关闭视图控制器,所有这些都可以正常工作。但是,当我启动交互式关闭转换并取消它时,状态栏的颜色仍为黑色 我创建了一个。点击“菜单”按钮,然后从屏幕右边缘平移,开始交互式转换 我尝试过的事情: 取消转换后,在涉及的任何导航和视图控制器上调用-setNeedsSta
UINavigationController
。父视图控制器有一个暗状态栏,而模态视图控制器有一个亮状态栏。我正在使用基于iOS 7 view controller的状态栏外观配置
只要我以非交互方式显示和关闭视图控制器,所有这些都可以正常工作。但是,当我启动交互式关闭转换并取消它时,状态栏的颜色仍为黑色
我创建了一个。点击“菜单”按钮,然后从屏幕右边缘平移,开始交互式转换
我尝试过的事情:
- 取消转换后,在涉及的任何导航和视图控制器上调用
-setNeedsStatusBarAppearanceUpdate
- 将navigationBar.barStyle更改为
并返回到UIBarStyleDefault
UIBarStyleBlack
(lldb) p (UIStatusBarStyle) [[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentedViewController] preferredStatusBarStyle]
(UIStatusBarStyle) $8 = UIStatusBarStyleLightContent
不过,状态栏是黑色的
你知道我可以尝试什么吗?对我来说,这看起来像是
UINavigationController
中的一个bug()。取消解雇后,UINavigationController
不会再次查询其presentedViewController
中的preferredStatusBarStyle
,而是从自身使用preferredStatusBarStyle
。我通过覆盖-childViewControllerForStatusBarStyle
解决了这个问题:
- (UIViewController*)childViewControllerForStatusBarStyle {
if (self.presentedViewController) {
return self.presentedViewController.childViewControllerForStatusBarStyle;
}
return [super childViewControllerForStatusBarStyle];
}
然后,为了在解雇期间(而不是之后)对更改进行动画处理,我还重写了-preferredStatusBarStyle
我把解决办法推到了最后 别忘了打电话
[self.transitionContext cancelInteractiveTransition];
在您的UIPercentDrivenInteractiveTransition子类中-(void)cancelInteractiveTransition
实现。这是我的灵感来源
- (void)cancelInteractiveTransition {
id<UIViewControllerContextTransitioning> transitionContext = self.transitionContext;
[transitionContext cancelInteractiveTransition];
UIView *fromView = [UIViewController fromViewForTransitioningContext:transitionContext];
UIView *toView = [UIViewController toViewForTransitioningContext:transitionContext];
if (self.presenting)
{
CGRect endFrame = CGRectOffset([[transitionContext containerView] bounds], 0, CGRectGetHeight([[transitionContext containerView] bounds]));
[UIView animateWithDuration:ANIMATION_DURATION_PAN animations:^{
toView.frame = endFrame;
} completion:^(BOOL finished) {
[transitionContext completeTransition:NO];
}];
}
else {
CGRect endFrame = [[transitionContext containerView] bounds];
[UIView animateWithDuration:ANIMATION_DURATION_PAN animations:^{
fromView.frame = endFrame;
} completion:^(BOOL finished) {
[transitionContext completeTransition:NO];
}];
}
-(无效)取消交互转换{
id transitionContext=self.transitionContext;
[transitionContext取消交互转换];
UIView*fromView=[UIViewController fromViewforTransitionContext:transitionContext];
UIView*toView=[UIViewController到ViewforTransitionContext:transitionContext];
如果(自我介绍)
{
CGRect endFrame=CGRectOffset([[transitionContext containerView]边界],0,CGRectGetHeight([[transitionContext containerView]边界]);
[UIView animateWithDuration:ANIMATION\u DURATION\u PAN动画:^{
toView.frame=endFrame;
}完成:^(布尔完成){
[transitionContext completeTransition:否];
}];
}
否则{
CGRect endFrame=[[transitionContext containerView]边界];
[UIView animateWithDuration:ANIMATION\u DURATION\u PAN动画:^{
fromView.frame=结束帧;
}完成:^(布尔完成){
[transitionContext completeTransition:否];
}];
}
}
编辑:这似乎对iOS 8.4有所帮助。按7.1测试,但不可能。也许苹果最近修复了它。完全有道理。然而,当presentedViewController还不是零,但转换刚刚完成时,我在这里遇到了某种冲突。因此,基本上preferredStatusBarStyle是在目标控制器[interactive Disclose]的ViewDid出现之前查询的。根据您的示例项目,您在NVC中做了更多的工作,就像我假设的那样。谢谢你的样品!