gpt4 book ai didi

ios - UIDynamicAnimator,removeAllBehaviors() 第一次不起作用

转载 作者:行者123 更新时间:2023-11-28 16:07:07 31 4
gpt4 key购买 nike

我定义了 UIDynamicAnimator 属性:

lazy fileprivate var animator: UIDynamicAnimator = {
return UIDynamicAnimator(referenceView: self)
}()

self 是 UIView 的子类;

在 self 类的扩展中,同一个文件,我有动画逻辑,使用我的动画师,添加 UIDynamicBehavior 项目:

    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,我添加了一个 Action ,它改变了 var,指出,我达到了目标点:

pushBehavior.action = { [unowned stampView] in
if stampView.center.x <= endPosition.x {
lastJump = true
}
}

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

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
}
}

最佳答案

你说你是这样测试的:

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() 是一个命令,应该 删除行为,但是现在不能遵守该命令,因为这些行为仍在运行,包括您的代码就在其中的行为。如果行为真的在那一刻停止,我们甚至都不会到达您的代码的下一行!

因此动画师在您的代码停止运行(也称为运行循环结束)之前实际上不会移除行为。

解决此问题的方法是等到您的代码停止之后,然后再调用removeAllBehaviors()。您可以使用我的 delay 实用程序 ( https://stackoverflow.com/a/24318861/341994 ) 轻松做到这一点:

public func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
if lastJump {
delay(0.1) {
animator.removeAllBehaviors()
}
}
}

关于ios - UIDynamicAnimator,removeAllBehaviors() 第一次不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40136098/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com