调用 completeTransition 后导航栏得到调整:在自定义转换中

Navigation bar gets adjusted after calling completeTransition: in custom transition(调用 completeTransition 后导航栏得到调整:在自定义转换中)

本文介绍了调用 completeTransition 后导航栏得到调整:在自定义转换中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的目标是从类似于启动应用程序时放大的跳板图标的视图为用户提供缩放模式过渡.

My goal is to provide zooming modal transition from for the user from a view similar as springboard icons zoom in when launching apps.

显示的视图控制器正确放大,但导航栏在状态栏下的位置错误.此位置在调用 [transitionContext completeTransition:finished]; 后得到更正.我怎样才能从过渡开始就正确?

The presented view controller zooms in correctly, but the navigation bar has wrong position under the status bar. This position gets corrected after calling [transitionContext completeTransition:finished];. How can I make it correct from the beginning of the transition?

这是错误的屏幕记录:http://youtu.be/7LKU4lzb-uw(故障在录制的第 6 秒)

This is a screen recording of the bug: http://youtu.be/7LKU4lzb-uw (the glitch is in the 6th second of the recording)

UIViewControllerAnimatedTransitioning 代码:

The UIViewControllerAnimatedTransitioning code:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView *container = [transitionContext containerView];

    CGPoint viewCenter = self.view.center;
    CGSize viewSize = self.view.frame.size;
    CGSize controllerSize = toViewController.view.frame.size;

    CGFloat controllerFromX = viewCenter.x - (controllerSize.width / 2);
    CGFloat controllerFromY = viewCenter.y - (controllerSize.height / 2);

    CGAffineTransform transform = CGAffineTransformMakeTranslation(controllerFromX, controllerFromY);
    transform = CGAffineTransformScale(transform, viewSize.width / controllerSize.width, viewSize.height / controllerSize.height);

    if (self.reverse) {
        [container insertSubview:toViewController.view belowSubview:fromViewController.view];
    } else {
        toViewController.view.transform = transform;
        [container addSubview:toViewController.view];
    }

    [UIView animateKeyframesWithDuration:ZoomTransitioningDuration 
                                   delay:0 
                                 options:0 
                              animations:^{
                if (self.reverse) {
                    fromViewController.view.alpha = 0.0f;
                    fromViewController.view.transform = transform;
                } else {
                    toViewController.view.transform = CGAffineTransformIdentity;
                }
        } 
                              completion:^(BOOL finished) {
                [transitionContext completeTransition:finished];
        }];
}

推荐答案

问题是您在 将目标视图控制器的视图插入容器之前设置了转换.

The problem is that you are setting the transform before inserting the destination view controller's view into the container.

切换顺序应该可以解决问题:

Switching the order should fix it:

if (self.reverse) {
    [container insertSubview:toViewController.view belowSubview:fromViewController.view];
} else {
    [container addSubview:toViewController.view];
    toViewController.view.transform = transform;
}

参见第 4 点 这里.由于您在将导航控制器的视图作为子视图插入之前应用了转换,因此布局引擎不会认为导航栏位于窗口的顶部边缘,因此不需要调整以避免状态吧.

See point 4 here. Since you've applied a transform prior to inserting the navigation controller's view as a subview, the layout engine doesn't think the navigation bar is at the top edge of the window, and therefore doesn't need to be adjusted to avoid the status bar.

这篇关于调用 completeTransition 后导航栏得到调整:在自定义转换中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:调用 completeTransition 后导航栏得到调整:在自定义转换中

基础教程推荐