我有两个重叠的动画,由于我设置我的方法的方式,导致第二个没有触发 . 我在方法的开头有这样的支票:
- (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]
似乎不起作用 .
3 回答
您可以使用
CABasicAnimation
而不是UIView
动画,这将更准确地解决问题 .您可以像以下一样使用它:
当您的服务电话结束时,您可以拨打
[self.layer removeAllAnimations];
同样,你可以使不透明度为1,并根据需要调整上述方法 .
你可以找到更多信息here .
__block
前缀为hidden
属性声明应该有帮助 .就像是,
@property (nonatomic) __block BOOL hidden;
如果您的目标是iOS 10,请查看UIViewPropertyAnimator https://developer.apple.com/reference/uikit/uiviewpropertyanimator?language=objc
结合UIViewAnimating和UIViewImplicitlyAnimating协议,这允许动画的修改/中断/暂停/恢复/停止/等 .
基本示例(IB中的按钮和视图集):