在iOS 6 SDK中被推得行为怪异时,我如何处理HidesBottomBar?

在iOS 6 SDK中被推得行为怪异时,我如何处理HidesBottomBar?,ios,uiviewcontroller,ios7,Ios,Uiviewcontroller,Ios7,我遇到了中描述的相同问题。如上所述: 摘要:UIViewController的hidesBottomBarWhenPushed属性 对于使用iOS 6 SDK(非beta SDK)构建的应用程序,无法按预期工作 适用于iOS 7)。隐藏底部栏(例如a)时,动画很奇怪 选项卡栏) 复制步骤: 使用Xcode 4中的TabBar模板创建一个新项目。将UINavigationController添加到FirstViewController。在屏幕上添加一个按钮 FirstViewController并

我遇到了中描述的相同问题。如上所述:

摘要:UIViewController的hidesBottomBarWhenPushed属性 对于使用iOS 6 SDK(非beta SDK)构建的应用程序,无法按预期工作 适用于iOS 7)。隐藏底部栏(例如a)时,动画很奇怪 选项卡栏)

复制步骤:

  • 使用Xcode 4中的TabBar模板创建一个新项目。将UINavigationController添加到FirstViewController。在屏幕上添加一个按钮 FirstViewController并设置其操作以推送新的视图控制器。 (请参见随附的样本代码)

  • 在iOS 7 beta 5设备上运行演示

  • 按下按钮,从UINavigationController返回,注意动画视图过渡

  • 预期结果:动画与iOS 6上的效果完全相同 装置

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

    示例代码:


    在使用iOS 6 SDK构建时,是否有任何方法修复或解决此问题?

    此问题肯定存在。我做了一些调查,找出了原因。使用
    UINavigationController
    推送视图控制器时,视图控制器的视图包含在
    uiviewcontrollerrapperview
    中,该视图是由
    UINavigationController
    管理的私有Apple视图。当过渡动画即将发生且按下时隐藏底部条形图设置为“是”时,此
    UIViewControllerRapperView
    将以错误的
    位置
    为Y轴设置动画,因此解决方案只是覆盖此行为并为动画提供正确的值。代码如下:

    //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
    
    }
    

    在我的例子中,我在每个选项卡中都有
    TabBarViewController
    UINavigationController
    ,面临着类似的问题。 我曾经

    当nextScreen是UITableViewController子类和应用的自动布局时,它可以正常工作。 但是,当
    nextScreen
    UIViewController
    时,它不能正常工作。我发现它取决于
    nextScreen
    自动布局约束

    所以我用这个代码更新了我的当前屏幕-

    override func viewWillDisappear(animated: Bool) {
    
            super.viewWillDisappear(animated)
    
            self.tabBarController?.tabBar.hidden = true
    
        }
    
    通过这种方式,你可以达到预期的结果,但这并不是实现它的好方法


    希望能有所帮助。

    在iOS 7中面临同样的问题:(推送时它就像一个魔咒!!但现在在回拨时面临问题:(您也可以为启动推送的控制器执行此操作。只需在if中删除
    hidesBottomBarWhenPushed
    复选框。根据您的需要进行调整。您可以同时放置推送的控制器和推送的控制器。对于推送的控制器,如果没有我喜欢它。
    override func viewWillDisappear(animated: Bool) {
    
            super.viewWillDisappear(animated)
    
            self.tabBarController?.tabBar.hidden = true
    
        }