我的应用有一个自定义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项目中重现。添加两个视图,一个在另一个上,并链接到顶部的插座。顶视图需要足够大,以便在首次启动时与底部视图重叠,或者您不会在第一次启动时重叠。看到问题。添加两个按钮并连接到底部的操作。
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)
}
}
答案 0 :(得分:0)
在我从holdCollision
中删除UIDynamicAnimator
之后,它就会丢失其边界列表。这似乎是一个bug,我就是这样报道的。它是rdar://23593048,如果有人想欺骗的话。