使用模态segue时没有动画

时间:2014-05-31 01:01:14

标签: objective-c xcode 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方法中调用此动画。如果我正在进行推送,那么再次有效..但不适用于模态。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

  

我在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];
        }];
    }
}