我遇到了this OpenRadar issue中描述的同样问题。如上所述:
摘要:UIViewController的hidesBottomBarWhenPushed属性 对于使用iOS 6 SDK构建的应用程序(不是beta SDK),它没有按预期工作 对于iOS 7)。隐藏底栏时动画很奇怪(例如a 标签栏)。
重现步骤:
使用Xcode中的TabBar模板创建一个新项目4.将UINavigationController添加到FirstViewController。在上添加一个按钮 FirstViewController并设置其动作以推送新的视图控制器。 (请参阅附带的示例代码)
在iOS 7 beta 5设备上运行演示。
- 醇>
按下按钮,从UINavigationController返回,注意动画视图过渡。
预期结果:动画与iOS 6完全相同 设备
实际结果:动画看起来很奇怪。 FirstViewController是 从底部滑下来。
示例代码:http://cl.ly/QgZZ
使用iOS 6 SDK构建时,有没有办法解决或解决这个问题?
答案 0 :(得分:6)
这个问题肯定存在。我做了一些调查,发现了导致它的原因。使用UINavigationController
推送视图控制器时,您查看控制器的视图包含在UIViewControllerWrapperView
中,该视图由UINavigationController
管理的私有Apple视图。当即将发生过渡动画并且hidesBottomBarWhenPushed
设置为YES时,对于Y轴,此UIViewControllerWrapperView
的动画显示错误position
,因此解决方案只是覆盖此行为并为动画提供正确的值。这是代码:
//Declare a property
@property (nonatomic, assign) BOOL shouldFixAnimation;
...
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
#ifndef __IPHONE_7_0 //If this constant is not defined then we probably build against lower SDK and we should do the fix
if (self.hidesBottomBarWhenPushed && [[[UIDevice currentDevice] systemVersion] floatValue] >= 7 && animated && self.navigationController) {
self.shouldFixAnimation = YES;
}
#endif
}
-(void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
#ifndef __IPHONE_7_0
if(self.shouldFixAnimation) {
self.shouldFixAnimation = NO;
CABasicAnimation *basic = (CABasicAnimation *)[self.view.superview.layer animationForKey:@"position"]; //The superview is this UIViewControllerWrapperView
//Just in case for future changes from Apple
if(!basic || ![basic isKindOfClass:[CABasicAnimation class]])
return;
if(![basic.fromValue isKindOfClass:[NSValue class]])
return;
CABasicAnimation *animation = [basic mutableCopy];
CGPoint point = [basic.fromValue CGPointValue];
point.y = self.view.superview.layer.position.y;
animation.fromValue = [NSValue valueWithCGPoint:point];
[self.view.superview.layer removeAnimationForKey:@"position"];
[self.view.superview.layer addAnimation:animation forKey:@"position"];
}
#endif
}
答案 1 :(得分:0)
在我的情况下,我在每个标签中都TabBarViewController
UINavigationController
面临类似的问题。
我用了,
nextScreen.hidesBottomBarWhenPushed = true
pushViewToCentralNavigationController(nextScreen)
当nextScreen是UITableViewController子类&应用自动布局。
但是,nextScreen
为UIViewController
时,它无法正常工作。我发现它取决于nextScreen
自动布局约束。
所以我刚用这段代码更新了我的currentScreen -
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.tabBarController?.tabBar.hidden = true
}
通过这种方式,你可以达到预期的效果,但这并不是实现目标的好方法。
希望它有所帮助。