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
然后多次调用 addBehavior
和 removeBehavior
,它只在第一次有效。如果我在每次点击时从头开始构建它,它总是有效的。可能是什么原因造成的?
更新: 我想出了一个示例项目来向 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 如果有人想欺骗。
我的应用程序有一个自定义的 UIButton,它有两个子视图,它们看起来像是被绳子挂起来了。当用户点击按钮时,一个会被拉回,然后与另一个发生碰撞。这在第一次碰撞时对我有用,但是当我第二次点击时,该项目不会被拉回。
在第一次调用 layoutSubviews()
时,我将两个视图都添加到一个 UIGravityBehavior
中,并给它们各自 UIAttachmentBehavior
。在 touchesBegan
上,我在需要拉回的视图附近添加了一个碰撞,然后在 touchesEnded
上或在计时器之后(如果是点击而不是长按),我删除了碰撞将其固定到位。
我将该碰撞存储在一个实例变量中(因此它被保留),并像这样创建它:
holdCollision = UICollisionBehavior(items: [theView])
holdCollision.addBoundaryWithIdentifier("boundary suspending item in air",
forPath: UIBezierPath(rect: holdCollisionViewFrame))
如果我构造一次 UICollisionBehavior
然后多次调用 addBehavior
和 removeBehavior
,它只在第一次有效。如果我在每次点击时从头开始构建它,它总是有效的。可能是什么原因造成的?
更新: 我想出了一个示例项目来向 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 如果有人想欺骗。