UICollisionBehavior 仅在第一次添加后有效
Posted
技术标签:
【中文标题】UICollisionBehavior 仅在第一次添加后有效【英文标题】:UICollisionBehavior only works after adding the first time 【发布时间】:2015-11-17 23:26:05 【问题描述】:我的应用程序有一个自定义 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)
【问题讨论】:
它与什么相撞?使用推动行为或强制行为不是更有意义吗?你确定它没有发布吗? @beyowulf 我让它与边界而不是项目发生冲突。我尝试了一个连续的推动行为,但它导致它振荡,而不是保持稳定。我更新了这个问题,提到我将碰撞行为存储为实例变量,所以它肯定不会被释放。但是当我注销它以验证时,我注意到在我将它从动画师中删除后它不再有任何边界。我会将其作为错误报告给 Apple。 【参考方案1】:看起来在我从UIDynamicAnimator
中删除holdCollision
之后,它丢失了边界列表。这似乎是一个错误,我就这样报告了它。如果有人想上当,请联系rdar://23593048。
【讨论】:
以上是关于UICollisionBehavior 仅在第一次添加后有效的主要内容,如果未能解决你的问题,请参考以下文章
结合 UIAttachmentBehavior 和 UICollisionBehavior