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,然后多次调用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)
    

【问题讨论】:

它与什么相撞?使用推动行为或强制行为不是更有意义吗?你确定它没有发布吗? @beyowulf 我让它与边界而不是项目发生冲突。我尝试了一个连续的推动行为,但它导致它振荡,而不是保持稳定。我更新了这个问题,提到我将碰撞行为存储为实例变量,所以它肯定不会被释放。但是当我注销它以验证时,我注意到在我将它从动画师中删除后它不再有任何边界。我会将其作为错误报告给 Apple。 【参考方案1】:

看起来在我从UIDynamicAnimator 中删除holdCollision 之后,它丢失了边界列表。这似乎是一个错误,我就这样报告了它。如果有人想上当,请联系rdar://23593048。

【讨论】:

以上是关于UICollisionBehavior 仅在第一次添加后有效的主要内容,如果未能解决你的问题,请参考以下文章

UICollisionBehavior 忽略屏幕边缘

结合 UIAttachmentBehavior 和 UICollisionBehavior

UIKit Dynamics UICollisionBehavior 无反弹的碰撞

如何制作这个浮动视图动画

Qt moveToThread 仅在第一次工作

SoundPool 仅在第一次播放声音