重叠 UIView 动画取消第一个完成块

Posted

技术标签:

【中文标题】重叠 UIView 动画取消第一个完成块【英文标题】:Overlapping UIView animation canceling the first completion block 【发布时间】:2016-02-09 03:53:24 【问题描述】:

我有两个按钮来移动视图。当我按下第一个按钮时,它会移动一个视图,另一个会将它移回。

第一个动画有一个完成块,但是当用户在完成之前将视图移回时,我想阻止这个块执行。

我已尝试使用针对与此类似的其他问题提供的解决方案,但它似乎并没有停止第一个完成块的执行。

@IBOutlet func moveView(sender: AnyObject) 
    UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, options: .AllowUserInteraction, animations:  /* animation */ )  _ in /* completion */ 


@IBOutlet func moveBack(sender: AnyObject) 
    UIView.animateWithDuration(0.0, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, options: .BeginFromCurrentState, animations:  /* animation */ )  _ in /* completion */ 

我也尝试删除所有动画,完成参数将为 false,但动画只会跳到结尾并从那里开始动画。

非常感谢任何想法。

【问题讨论】:

【参考方案1】:

您可以使用布尔标志来实现所需的功能,如下所示:

var moveViewFlag = false var moveBackFlag = false

@IBOutlet func moveView(sender: AnyObject) 
UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, options: .AllowUserInteraction, animations:  /* animation */ )  _ in /* completion */ 

        //inside completion block make the moveBackFlag to true
        moveBackFlag = true
   




@IBOutlet func moveBack(sender: AnyObject) 
UIView.animateWithDuration(0.0, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0, options: .BeginFromCurrentState, animations:  /* animation */ )  _ in /* completion */ 
    //inside completion block make the moveBackFlag to true
        moveViewFlag = true

       if moveBackFlag
          //do whatever you want to do!
       


希望这会有所帮助。

你应该创建一个自定义类并在类中处理它以避免混乱的标志。

【讨论】:

我曾想过使用标志来解决这个问题,但我有多个动画,最终会出现太多标志。很难跟踪,如果我想改变某些东西,我必须重新弄清楚一切。【参考方案2】:

搜索了一段时间后,我想我找到了解决方案。要使完成块返回 false,必须删除动画。但是这样做,动画会跳转到“结束状态”,所以为了防止这种情况我使用了:

object.layer.frame = object.layer.presentationLayer()!.frame
object.layer.removeAllAnimations()

从这里我可以开始我的新动画(向后移动对象),而不必担心第一个动画的完成块。 Information

我不确定是否应该这样做,或者是否有更好的方法。

【讨论】:

以上是关于重叠 UIView 动画取消第一个完成块的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 在单个 UIView 上同时进行多个动画

UIView 动画被调用两次,取消动画

我可以立即停止第一个 UIView 动画并在同一视图上启动第二个动画吗?

取消 UIView 动画 - self.view.layer removeAllAnimations 不起作用

如何取消基于UIView块的动画?

如何用动画取消隐藏 UIView