簡體   English   中英

強制調用UIView animateWithDuration完成塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM