0

我遇到了这个 OpenRadar问题中描述的相同问题。如那里所述:

摘要: UIViewController 的 hidesBottomBarWhenPushed 属性对于使用 iOS 6 SDK(不是 iOS 7 的 beta SDK)构建的应用程序无法正常工作。隐藏底部栏(例如标签栏)时动画很奇怪。

重现步骤:

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

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

  3. 按下按钮,从 UINavigationController 返回,注意动画视图转换。

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

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

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

使用 iOS 6 SDK 构建时,有什么方法可以修复或解决此问题?

4

2 回答 2

6

这个问题肯定存在。我做了一些调查,发现是什么原因造成的。使用 推送视图控制器时UINavigationController,视图控制器的视图包含在 中UIViewControllerWrapperView,这是由 . 管理的私有 Apple 视图UINavigationController。当过渡动画即将发生并且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

}
于 2013-09-23T13:40:38.913 回答
1

在我的情况下,我TabBarViewControllerUINavigationController每个选项卡中都遇到了类似的问题。我用了,

nextScreen.hidesBottomBarWhenPushed = true
pushViewToCentralNavigationController(nextScreen)

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

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

override func viewWillDisappear(animated: Bool) {

        super.viewWillDisappear(animated)

        self.tabBarController?.tabBar.hidden = true

    }

通过这种方式,您可以实现预期的结果,但它不是实现它的好方法。

希望能帮助到你。

于 2016-08-25T12:29:30.520 回答