[英]iOS - completion block in UIView animateWithDuration gets called too early
[英]Force UIView animateWithDuration completion block to be called
我有兩個重疊的動畫,由於我設置我的方法的方式,導致第二個沒有觸發。 我在方法的開頭有這樣的支票:
- (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]
似乎不起作用。
您可以使用CABasicAnimation
而不是UIView
動畫,這將更准確地解決問題。
您可以像以下一樣使用它:
CABasicAnimation* opacityZero= [CABasicAnimation animationWithKeyPath:@"opacity"];
[opacityZero setToValue:[NSNumber numberWithFloat:0.0]];
[opacityZero setDuration:duration];
[[self layer] addAnimation:opacityZero forKey:@"opacityZero"];
當您的服務呼叫結束時,您可以調用[self.layer removeAllAnimations];
同樣,你可以使不透明度為1,並根據需要調整上述方法。
你可以在這里找到更多信息。
以hidden
屬性聲明為前綴的__block
應該有所幫助。
就像是,
@property (nonatomic) __block BOOL hidden;
如果您的目標是iOS 10+,請查看UIViewPropertyAnimator https://developer.apple.com/reference/uikit/uiviewpropertyanimator?language=objc
結合UIViewAnimating和UIViewImplicitlyAnimating協議,這允許動畫的修改/中斷/暫停/恢復/停止/等。
基本示例(IB中的按鈕和視圖集):
- (IBAction)startTapped:(id)sender {
_myAnimator = [UIViewPropertyAnimator
runningPropertyAnimatorWithDuration:3.0
delay:0.0
options:UIViewAnimationOptionCurveLinear
animations:^{
_theRedBox.alpha = _theRedBox.alpha > 0 ? 0 : 1;
} completion:^(UIViewAnimatingPosition finalPosition) {
// do stuff
}];
}
- (IBAction)stopTapped:(id)sender {
[_myAnimator stopAnimation:NO];
[_myAnimator finishAnimationAtPosition:UIViewAnimatingPositionEnd];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.