- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我定义了 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/
我定义了 UIDynamicAnimator 属性: lazy fileprivate var animator: UIDynamicAnimator = { return UIDyn
我是一名优秀的程序员,十分优秀!