繁体   English   中英

未调用UICollisionBehaviorDelegate方法

[英]UICollisionBehaviorDelegate methods not called

我使用UIKitDynamics开发应用程序并实现碰撞检测。

碰撞检测正在发挥作用。 但不知何故,没有调用UICollisionBehaviorDelegate方法。 没有显示警告或错误。

我创建了一个示例项目来演示该问题:

  import UIKit

  class ViewController: UIViewController {
    private var dynamicAnimator: UIDynamicAnimator?

    override func viewDidLoad() {
      super.viewDidLoad()
      // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewDidAppear(_ animated: Bool) {
      super.viewDidAppear(animated)

      self.initPhysics()
    }

    fileprivate var initalized = false
    fileprivate func initPhysics() {
      if initalized {
        return
      }
      initalized = true

      let physicsView = UIView(frame: view.bounds.insetBy(dx: 40, dy: 40))
      physicsView.backgroundColor = UIColor.black

      self.dynamicAnimator = UIDynamicAnimator(referenceView: physicsView)

      physicsView.isUserInteractionEnabled = false
      view.addSubview(physicsView)

      //Create ball
      let frame = CGRect(x: 0, y: 0, width: 40, height: 40)

      let rect = UIView(frame: frame)
      rect.backgroundColor = UIColor.red
      physicsView.addSubview(rect)

      let behavior = UIDynamicItemBehavior(items: [rect])
      behavior.elasticity = 1.0
      behavior.resistance = 0.0
      behavior.friction = 0.0
      behavior.allowsRotation = false
      self.dynamicAnimator?.addBehavior(behavior)

      //collision behavior setup
      let collisionBehavior = UICollisionBehavior(items: [rect])
      collisionBehavior.collisionDelegate = self
      collisionBehavior.setTranslatesReferenceBoundsIntoBoundary(with: .zero)
      collisionBehavior.collisionMode = .everything
      self.dynamicAnimator?.addBehavior(collisionBehavior)

      //Push ball
      let pushBehavior = UIPushBehavior(items: [rect], mode: UIPushBehaviorMode.instantaneous)
      pushBehavior.active = true
      pushBehavior.pushDirection = CGVector(dx: 0.5, dy: 0.5)
      self.dynamicAnimator?.addBehavior(pushBehavior)
    }
  }

  extension ViewController: UICollisionBehaviorDelegate {
    // DELEGATE METHODS NOT CALLED
    func collisionBehavior(_ behavior: UICollisionBehavior,
                           beganContactFor item: UIDynamicItem,
                           withBoundaryIdentifier identifier: NSCopying?,
                           at p: CGPoint) {
      print("began contact boundary")
    }

    func collisionBehavior(_ behavior: UICollisionBehavior,
                           endedContactFor item: UIDynamicItem,
                           withBoundaryIdentifier identifier: NSCopying?) {
      print("contact boundary ended")
    }

    func collisionBehavior(_ behavior: UICollisionBehavior,
                           endedContactFor item1: UIDynamicItem,
                           with item2: UIDynamicItem) {

      print("contact item ended")
    }

    func collisionBehavior(_ behavior: UICollisionBehavior,
                           beganContactFor item1: UIDynamicItem,
                           with item2: UIDynamicItem,
                           at p: CGPoint) {
      print("began contact item")
    }
  }

基础SDK:iOS 11.2,Xcode版本9.2(9C40b)

谢谢您的帮助!

这不是它的工作原理(可悲的是)。你的碰撞行为中只有一个项目你要求它检测碰撞与什么??? 如果您添加了第二个项目,您将看到委托被调用..

真正的问题是为什么? 好吧,碰撞检测一个项目的框架是否与另一个框架的框架相交。如果它做了你要求的( rectphysicsView一个孩子),那么它总是会碰撞(这不是你想要的)。

由于你的physicsView不是碰撞行为的一部分,你什么也得不到。你告诉它限制项目在其范围内( setTranslatesReferenceBoundsIntoBoundary对添加到行为本身的项目起作用),但不检测与边界的碰撞。 例如,如果项目在physicsView之外,它将无法进入。如果它在里面,它就无法离开。 但它不会被视为每次碰撞(否则它总是碰撞)。

为了检测rectphysicsView之间的冲突,你需要给physicsView一些物理属性..现在它只是一个普通的UIView (参考视图)..

另一种必须为其提供物理属性的方法是为它添加边界:

collisionBehavior.addBoundary(withIdentifier: "PhysicsViewBoundary" as NSString, for: UIBezierPath(rect: physicsView.bounds))

现在它将调用:

func collisionBehavior(_ behavior: UICollisionBehavior,
                       beganContactFor item: UIDynamicItem,
                       withBoundaryIdentifier identifier: NSCopying?,
                       at p: CGPoint) {
    print("began contact boundary")
}

func collisionBehavior(_ behavior: UICollisionBehavior,
                       endedContactFor item: UIDynamicItem,
                       withBoundaryIdentifier identifier: NSCopying?) {
    print("contact boundary ended")
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM