使用modal segue时没有动画



我有一个视图控制器和一些对象,我有一些简单的动画连接。

[UIView animateWithDuration:0.25
                          delay: 10.1
                        options: UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         addNameViewConstraint.constant = 10;
                         addNameView.alpha = 1.0;
                         [self.view layoutIfNeeded];   // move
                     }
                     completion:nil];
    [UIView animateWithDuration:0.25
                          delay: 0.15
                        options: UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         addEmailViewConstraint.constant = 10;
                         addEmailView.alpha = 1.0;
                         [self.view layoutIfNeeded];   // move
                     }
                     completion:nil];

当我使用push segue时,动画工作得很好。但当我切换到使用模态segue时,动画停止工作了。我把第一个视频的延迟时间增加到10.2秒,心想也许在我看到它之前它已经在动画了。我在viewWillAppear方法中调用这个动画。如果我在做push segue。但不是模态的。什么好主意吗?

我在viewWillAppear方法中调用这个动画

这是一个常见的错误。viewWillAppear:太早了,不能开始动画。视图还没有出现,所以没有什么可以动画。把animateWithDuration:...代码移到viewDidAppear:,一切都会好起来的。

然而,正如你在评论中所说,这还不够令人满意。你要做的是模态过渡应该发生,你的额外动画在新视图中应该已经发生,因为模态视图正在出现的过程中。相反,与viewDidAppear:,模态视图完成出现,它安置到位,和然后你的其他动画开始,这不是那么酷。

一种解决方案可能是再次移动动画,这次移动到viewWillLayoutSubviews。这个比较棘手,因为这个方法被调用了很多次。你需要使用BOOL实例变量作为标志来确保你的动画只运行一次。因此,这应该可以工作(我试过了,看起来很好):

-(void)viewWillLayoutSubviews {
    if (!self->didLayout) {
        self->didLayout = YES;
        [UIView animateWithDuration:0.25 animations:^{
            // mess with constraint constants here
            [self.subv layoutIfNeeded];
        }];
    }
}

最新更新