UIViewControllerTransitioningDelegate 处理 dismiss 动画时遇到 NSLayoutConstraint 问题

10

1) 我有一个任务,需要用自定义动画呈现和关闭模态视图控制器。

2) 自定义动画是改变透明度和移动一个子元素。

3) 我创建了FadeInAnimationControllerFadeOutAnimationController类来实现UIViewControllerAnimatedTransitioning,如下所示:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    // obtain state from the context
    CIToViewController *toViewController = (CIToViewController *)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    // obtain the container view
    UIView *containerView = [transitionContext containerView];

    // set the intial state
    toViewController.view.alpha = 0.0f;
    toViewController.elementBottomPosition.constant -= 20.0f;
    [toViewController.view layoutIfNeeded];

    // add the view
    [containerView addSubview:toViewController.view];

    // animate
    [UIView animateWithDuration:[self transitionDuration:transitionContext]
                     animations:^{
                         toViewController.view.alpha = 1.0f;
                         toViewController.elementBottomPosition.constant += 20.0f;
                         [toViewController.view layoutIfNeeded];
                     }
                     completion:^(BOOL finished) {
                         [transitionContext completeTransition:YES];
                     }];
     }

4) elementBottomPosition 是 NSLayoutConstraint,对于 Present 动画它能够正常工作。

5) 问题:

对于 Dismiss 动画,NSLayoutConstraint 无法正常工作,因此我只能使用 Frame 实现相同的效果。这种方法在 AutoLayout 和 iOS7 上表现不是很好,但由于我需要关闭此视图,所以我不关心其自动布局。

那么问题是为什么 NSLayoutConstraint 方法无法正常工作?我在 animateTransition 中记录了约束:

NSLog(@"constraints %@", fromViewController.view.constraints);

它们仍然存在。


是的,这部分无法工作,但只是Dismiss有问题,Present运行良好。 - Artem
你能详细解释一下它哪方面出了问题吗? - Arek Holko
你能看到在执行 animations: 块之前,消失的控制器上的 viewWillDisappearviewDidDisappear 是否被调用了吗? - Arek Holko
我也遇到了同样的问题。有人找到解决方法,使布局约束在自定义 dismiss 动画期间起作用吗? - cpprulez
遇到同样的问题。 - Matt
显示剩余3条评论
1个回答

0

不要在动画块中设置自动布局常量。

toViewController.elementBottomPosition.constant -= 20.0f;
[self.view layoutIfNeeded];
toViewController.elementBottomPosition.constant += 20.0f;

//Animation block here ^{
[self.view layoutIfNeeded];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接