首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIDynamicAnimator,removeAllBehaviors()第一次不能工作

UIDynamicAnimator,removeAllBehaviors()第一次不能工作
EN

Stack Overflow用户
提问于 2016-10-19 15:45:33
回答 1查看 404关注 0票数 0

我定义了UIDynamicAnimator属性:

代码语言:javascript
复制
lazy fileprivate var animator: UIDynamicAnimator = {
        return UIDynamicAnimator(referenceView: self)
}()

self是UIView的子类;

在扩展名为self类的同一个文件中,我有使用我的动画的逻辑,它使用我的动画器,添加了UIDynamicBehavior项:

代码语言:javascript
复制
    let pushBehavior = UIPushBehavior(items: [stampView], mode: .continuous)
//some settings
    let dynamicItemBehavior = UIDynamicItemBehavior(items: [stampView])
//some settings
    let gravityBehavior = UIGravityBehavior(items: [stampView])
//some settings
    let collisionBehavior = UICollisionBehavior(items: [stampView])
//some settings

一切都很好,但是当我尝试用removeAllBehaviors()停止所有动画时,动画会停止,但是行为仍然在animator.behaviors中。第二次调用它时,数组变为空。

//==

对于我的pushBehavior,我添加了操作,它改变了var,指示我达到了目标点:

代码语言:javascript
复制
pushBehavior.action = { [unowned stampView] in
            if stampView.center.x <= endPosition.x {
                lastJump = true
            }
        }

在collisionBehavior委托方法中,我检查这个变量并尝试用removeAllBehaviors()停止动画

代码语言:javascript
复制
public func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
    if lastJump {
        //animator.behaviors.count = 4
        animator.removeAllBehaviors()
        //still, animator.behaviors.count = 4
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-19 16:31:25

你说你要这样测试:

代码语言:javascript
复制
public func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
    if lastJump {
        //animator.behaviors.count = 4
        animator.removeAllBehaviors()
        //still, animator.behaviors.count = 4
    }
}

嗯,animator.removeAllBehaviors()是一个应该删除行为的命令,但是现在不能遵守该命令,因为这些行为仍然在运行,包括您的代码正在运行的那个。如果行为在那一刻就停止了,我们甚至永远不会到达您的代码的下一行!

因此,动画师实际上不会删除这些行为,直到您的代码停止运行(也称为run循环的结束)。

在调用removeAllBehaviors()之前,如何解决这个问题,直到代码停止时才开始工作。您可以使用我的delay实用程序(https://stackoverflow.com/a/24318861/341994)轻松地做到这一点:

代码语言:javascript
复制
public func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
    if lastJump {
        delay(0.1) {
            animator.removeAllBehaviors()
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40136098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档