我如何解决hidesBottomBarWhenPushed与iOS 6 SDK的行为奇怪?

时间:2013-09-15 15:09:54

标签: ios uiviewcontroller ios7

我遇到了this OpenRadar issue中描述的同样问题。如上所述:

  

摘要:UIViewController的hidesBottomBarWhenPushed属性   对于使用iOS 6 SDK构建的应用程序(不是beta SDK),它没有按预期工作   对于iOS 7)。隐藏底栏时动画很奇怪(例如a   标签栏)。

     

重现步骤:

     
      
  1. 使用Xcode中的TabBar模板创建一个新项目4.将UINavigationController添加到FirstViewController。在上添加一个按钮   FirstViewController并设置其动作以推送新的视图控制器。   (请参阅附带的示例代码)

  2.   
  3. 在iOS 7 beta 5设备上运行演示。

  4.   
  5. 按下按钮,从UINavigationController返回,注意动画视图过渡。

  6.         

    预期结果:动画与iOS 6完全相同   设备

         

    实际结果:动画看起来很奇怪。 FirstViewController是   从底部滑下来。

         

    示例代码:http://cl.ly/QgZZ

使用iOS 6 SDK构建时,有没有办法解决或解决这个问题?

2 个答案:

答案 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子类&应用自动布局。 但是,nextScreenUIViewController时,它无法正常工作。我发现它取决于nextScreen自动布局约束。

所以我刚用这段代码更新了我的currentScreen -

override func viewWillDisappear(animated: Bool) {

        super.viewWillDisappear(animated)

        self.tabBarController?.tabBar.hidden = true

    }

通过这种方式,你可以达到预期的效果,但这并不是实现目标的好方法。

希望它有所帮助。