【发布时间】:2017-02-14 19:17:56
【问题描述】:
我有两个重叠的动画,由于我设置方法的方式,导致第二个不触发。我在方法的开头有这样的检查:
- (void)animateHidden:(BOOL)hidden duration:(CGFloat)seconds delay:(CGFloat)delay options:(UIViewAnimationOptions)options disableUserInteraction:(BOOL)disableUserInteraction {
if (self.hidden == hidden) {
return;
}
然后,再往下,我的动画块看起来像这样:
__weak UIView *weakSelf = self;
[UIView animateWithDuration:seconds delay:delay options:options animations:^{
weakSelf.alpha = hidden ? 0 : 1;
} completion:^(BOOL finished) {
// Return user interaction to previous state
if (disableUserInteraction) {
weakSelf.userInteractionEnabled = userInteractionEnabled;
}
weakSelf.hidden = hidden;
}];
两个动画在同一个视图上启动,一个在服务调用之前,一个在服务调用之后。如果服务调用发生得足够快以至于视图仍在动画中,weakSelf.hidden = hidden; 将永远不会被调用,并且第二个动画将退出,因为hidden 的值没有及时更新。
无论如何我可以强制调用animation 块上的完成块吗?在进行检查之前,我需要更新我的 hidden 属性,但找不到完成此操作的方法。
不幸的是,致电[self.layer removeAllAnimations] 似乎不起作用。
【问题讨论】:
-
不确定您在这些方法中还可以做什么,但是...如果不使用您的
hidden属性/变量,而是检查.alpha值,它对您有用吗?这会告诉你动画是否完成。 -
无论如何都应该调用完成块。你可以做什么?最简单/最快的方法是制作标志并检查是否已经完成。
-
@DonMag 问题在于,当我们调用此方法时,视图最初可能已隐藏,
alpha为 1,因此检查与对应的alpha值hidden值不适用于所有视图。
标签: ios objective-c uiview