我有一个视图控制器并且有一些对象,我有一些简单的动画连接到。
[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方法中调用此动画。如果我正在进行推送,那么再次有效..但不适用于模态。有什么想法吗?
答案 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];
}];
}
}