我有一个视图控制器和一些对象,我有一些简单的动画连接。
[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];
}];
}
}