首页 文章

强制调用UIView animateWithDuration完成块

提问于
浏览
1

我有两个重叠的动画,由于我设置我的方法的方式,导致第二个没有触发 . 我在方法的开头有这样的支票:

- (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 回答

  • 0

    您可以使用 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,并根据需要调整上述方法 .

    你可以找到更多信息here .

  • 0

    __block 前缀为 hidden 属性声明应该有帮助 .
    就像是,
    @property (nonatomic) __block BOOL hidden;

  • 0

    如果您的目标是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];
    
    }
    

相关问题