UICollisionBehavior仅在首次添加后才有效

时间:2015-11-17 23:26:06

标签: ios swift uikit-dynamics

我的应用有一个自定义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项目中重现。添加两个视图,一个在另一个上,并链接到顶部的插座。顶视图需要足够大,以便在首次启动时与底部视图重叠,或者您不会在第一次启动时重叠。看到问题。添加两个按钮并连接到底部的操作。

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

1 个答案:

答案 0 :(得分:0)

在我从holdCollision中删除UIDynamicAnimator之后,它就会丢失其边界列表。这似乎是一个bug,我就是这样报道的。它是rdar://23593048,如果有人想欺骗的话。