我的应用程序有一个定制的UIButton,它有两个子视图,看起来像是被字符串挂起的。当用户点击按钮时,其中一个被拉回,然后与另一个发生碰撞。这是对我的第一次碰撞,但当我去点击第二次,该项目不会被撤回。
在第一次调用layoutSubviews()时,我将这两个视图添加到UIGravityBehavior中,并为每个视图提供各自的UIAttachmentBehavior。在touchesBegan上,我在视图旁边添加了一个冲突,该视图需要被撤回,然后在touchesEnded上或者计时器之后,如果它是一个抽头而不是一个长按压,我就移除保持其位置的碰撞。
我将冲突存储在一个实例变量中(因此它被保留了),并按照如下方式创建它:
holdCollision = UICollisionBehavior(items: [theView])
holdCollision.addBoundaryWithIdentifier("boundary suspending item in air",
forPath: UIBezierPath(rect: holdCollisionViewFrame))如果我构造UICollisionBehavior一次,然后使用它多次调用addBehavior和removeBehavior,那么它只在第一次工作。如果我在每个水龙头上从头开始构建它,它总是能工作的。是什么导致了这一切?
更新:I提出了一个向苹果报告的示例项目。您可以在一个干净的单视图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)
}
}发布于 2015-11-18 13:58:48
看起来,在我从holdCollision中删除UIDynamicAnimator之后,它就失去了它的边界列表。那好像是个窃听器,我也是这样报告的。如果有人想骗我,那就是雷达://23593048。
https://stackoverflow.com/questions/33769021
复制相似问题