通过UIPresentationController子类呈现视图控制器时跳转导航栏

时间:2015-03-18 13:44:18

标签: ios objective-c uinavigationcontroller uipresentationcontroller

我正在构建iOS 8应用程序并使用UIPresentationController以自定义方式呈现视图控制器。 (请参阅我之前关于此的问题:Replicating the style of the iOS Mail App's Compose Function)。

我遇到的问题是,当我出示控制器时,导航栏开始时为64点高,然后在演示完成后跳转/收缩回44。我的猜测是视图控制器意识到它没有覆盖状态栏,因此一旦到达其最终静止位置,它就会自行缩小。我希望导航栏在整个时间内高44点,而不是跳跃/缩小。

下面的图片是视图控制器在演示文稿结束时的样子。这也是我希望它看起来像整个时间。有关如何将导航栏保持在44点整个时间的任何想法?

enter image description here

更新(2015年3月24日):

我前一段时间引用了一篇博文,以找到有关此问题的更多信息。基本上,UINavigationController将其导航栏绘制为64或44点高,具体取决于其视图的框架是否与应用程序的窗口匹配。所以我需要一些方法告诉导航控制器它的最终静止位置不会与窗口对齐,并且导航栏应该被绘制44点高。

http://blog.jaredsinclair.com/post/61507315630/wrestling-with-status-bars-and-navigation-bars-on

2 个答案:

答案 0 :(得分:1)

终于找到了这个问题的答案。它在之前的堆栈溢出帖子中进行了解释:

Navigation bar gets adjusted after calling completeTransition: in custom transition

感谢您不让我使用我辛苦赚来的代表来获得赏金!

答案 1 :(得分:1)

我有一个类似你的问题,根据navigationBar的框架与UIWindow顶部共享边框的视觉连续性,导航栏会在调用[transitionContext completeTransition:YES]后调整大小。我的导航栏远不及顶部,因此它将自身调整为44px而不是正常的“在状态下延伸”64px。为了解决这个问题,我在完成动态toViewController的alpha和位置之前完成了转换。也就是说,一旦所有内容都被正确定位以进行动画处理,我调用completeTransition:让navigationController在看不见时自行调整。到目前为止,这没有任何意外的副作用,并且在completeTransition之后,移动帧动画中的附加alpha动画仍在继续。

以下是我的演示动画类中符合animateTransition:

<UIViewControllerAnimatedTransitioning>方法
    UIViewController *toViewController          = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController *fromViewController        = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    UIViewController *presentedViewController   = self.presenting ? toViewController : fromViewController;
    UIView *containerView                       = [transitionContext containerView];

    NSTimeInterval animationDuration            = [self transitionDuration:transitionContext];

    if (self.presenting) {
        containerView.alpha = 0.0;
        presentedViewController.view.alpha = 0.0;
        [containerView addSubview:presentedViewController.view];
        [UIView animateWithDuration:animationDuration delay:0 options:kNilOptions animations:^{
            containerView.alpha = 1.0;
        } completion:^(BOOL finished) {
            presentedViewController.view.frameTop += 20;
            //I complete the transition here, while my controller's view is still invisible, 
            // but everything is in its proper place.  This effectively positions everything 
            // for animation, while also letting the navigation bar resize itself without jarring visuals.
            [transitionContext completeTransition:YES];
            //But we're not done quite yet...
            [UIView animateWithDuration:animationDuration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
                presentedViewController.view.frameTop -= 20;
                presentedViewController.view.alpha = 1.0;
            } completion:nil];
        }];
    }

    if (!self.presenting) {
        [UIView animateWithDuration:animationDuration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            presentedViewController.view.alpha = 0.0;
            presentedViewController.view.frameTop += 20;
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:animationDuration delay:0 options:kNilOptions animations:^{
                containerView.alpha = 0.0;
            } completion:^(BOOL done) {
                [transitionContext completeTransition:YES];
            }];
        }];
    }

希望这有助于任何发现自己处于我位置的人!