UICollisionBehavior 仅在第一次添加后起作用

UICollisionBehavior only works after adding the first time

我的应用程序有一个自定义的 UIButton,它有两个子视图,它们看起来像是被绳子挂起来了。当用户点击按钮时,一个会被拉回,然后与另一个发生碰撞。这在第一次碰撞时对我有用,但是当我第二次点击时,该项目不会被拉回。

在第一次调用 layoutSubviews() 时,我将两个视图都添加到一个 UIGravityBehavior 中,并给它们各自 UIAttachmentBehavior。在 touchesBegan 上,我在需要拉回的视图附近添加了一个碰撞,然后在 touchesEnded 上或在计时器之后(如果是点击而不是长按),我删除了碰撞将其固定到位。

我将该碰撞存储在一个实例变量中(因此它被保留),并像这样创建它:

    holdCollision = UICollisionBehavior(items: [theView])
    holdCollision.addBoundaryWithIdentifier("boundary suspending item in air",
        forPath: UIBezierPath(rect: holdCollisionViewFrame))

如果我构造一次 UICollisionBehavior 然后多次调用 addBehaviorremoveBehavior,它只在第一次有效。如果我在每次点击时从头开始构建它,它总是有效的。可能是什么原因造成的?

更新: 我想出了一个示例项目来向 Apple 报告。您可以在干净的单视图 iOS 项目中重现。添加两个视图,一个在另一个之上,然后 link 到顶部的出口。顶部视图需要足够大,以便在首次启动时与底部视图重叠,否则您将看不到问题。添加两个按钮并连接到底部的操作。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var topView: UIImageView!
    @IBOutlet weak var bottomView: UIView!

    var animator: UIDynamicAnimator!
    var collision: UICollisionBehavior!

    override func viewDidLoad() {
        super.viewDidLoad()

        animator = UIDynamicAnimator(referenceView: view)

        let gravity = UIGravityBehavior(items: [topView])
        animator.addBehavior(gravity)

        var anchor = view.center
        anchor.y -= 100

        let attachment = UIAttachmentBehavior(item: topView, attachedToAnchor: anchor)
        animator.addBehavior(attachment)

        collision = UICollisionBehavior(items: [topView])
        collision.addBoundaryWithIdentifier("bottom boundary", forPath: UIBezierPath(rect: bottomView.frame))
    }

    @IBAction func addCollision() {
        NSLog("boundaries: \(collision.boundaryIdentifiers)")
        animator.addBehavior(collision)
    }

    @IBAction func removeCollision() {
        animator.removeBehavior(collision)
    }
}

我从 UIDynamicAnimator 中删除 holdCollision 后,它似乎失去了边界列表。这似乎是一个错误,我就这样报告了。 rdar://23593048 如果有人想欺骗。