CollisionBehavior не вызывается

Я пытался заставить работать этот функционал CollisionBehavior.

lazy var collisionDelegate: UICollisionBehaviorDelegate = self

func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item1: UIDynamicItem, with item2: UIDynamicItem, at p: CGPoint) {
    print("colliding")
}
func collisionBehavior(_ behavior: UICollisionBehavior, beganContactFor item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, at p: CGPoint) {
    print("colliding")
}

Как вы можете видеть, я пробовал оба метода collisionBehavior. Шар и блоки - все динамические объекты, и у меня концы экрана являются границей. Таким образом, каждый раз, когда блок или "шар" ударяется о другой блок, весло, шар или конец экрана, он должен печатать "столкновение", но ничего не выводится на терминал. Ниже приведен код для блока, шара, весла и границ.

Paddle:

    func paddle () {
    lastPaddle.removeFromSuperview()
    collider.removeItem(lastPaddle)

    let yPos = CGFloat(bounds.size.height / 6 * 5)
    let width = bounds.size.width / 4
    let height = bounds.size.width / 20
    if !first {xPos = bounds.midX; first = true}

    let paddle = CGRect(x: xPos + width/2, y: yPos + height/2, width: width, height: height)
    let frame = UIView(frame: paddle)
    frame.backgroundColor = UIColor.red()
    addSubview(frame)
    let item: UIDynamicItem = frame

    let dib = UIDynamicItemBehavior()
    animator.addBehavior(dib)
    dib.allowsRotation = false
    dib.isAnchored = true
    dib.elasticity = 0

    dib.addItem(item)
    collider.addItem(item)
    lastPaddle = frame


    //collider.removeBoundary(withIdentifier: "paddle")

    //update()
}

Мяч:

func createBall () {


    xBall = bounds.midX
    yBall = bounds.midY

    let smallRect = CGRect(x: xBall, y: yBall, width: bounds.size.width/12, height: bounds.size.width/12)
    //let lBall = CGPath(ellipseIn: smallRect, transform: nil)
    ball = smallRect
    let frame = UIView(frame: smallRect)
    frame.backgroundColor = UIColor.green()
    addSubview(frame)
    let item: UIDynamicItem = frame
    //collider.elasticity = 100
    gravity.magnitude = 0.5
    gravity.addItem(item)
    collider.addItem(item)
    //let arr = [item]

    animator.addBehavior(ballBehaviour)

    ballBehaviour.elasticity = 1.5

    ballBehaviour.addItem(item)


}

Блоки и конец экрана (граница):

    func createBlocks () {
    for a in 0..<numberOfRows {
        for b in 0..<numberOfColumns {
            //let view = UIView()
            let x = CGFloat(b) * (bounds.size.width/CGFloat(numberOfColumns))
            let y = CGFloat(a) * (bounds.size.height/CGFloat(numberOfRows))
            let width = bounds.size.width/CGFloat(numberOfColumns)/2
            let height = bounds.size.height/CGFloat(numberOfRows)/8
            let rect = CGRect(x: x + width/2, y: y/3 + height*3, width: width, height: height)
            //print(rect)
            let frame = UIView(frame: rect)
            blocks.append(frame)
            frame.backgroundColor = UIColor.blue()
            addSubview(frame)
            let item: UIDynamicItem = frame
            //gravity.addItem(item)
            collider.addItem(item)

            blockBehaviour.addItem(item)
            animator.addBehavior(blockBehaviour)





        }
    }
    let rectangle = CGRect(x: 0, y: 0, width: bounds.size.width, height: 3/2 * bounds.size.height)
    //print(rectangle)
    let boundary = UIBezierPath(rect: rectangle)
    collider.addBoundary(withIdentifier: "screen", for: boundary)

}

Спасибо за любую помощь

1 ответ

Решение

Ваш lazy var не собирается работать. Объект (self) не каким-то волшебным образом поднимает руку и говорит: "Посмотри на меня, я - делегат столкновения!" Это не то, как действует делегация.

Объект UICollisionBehavior (который я на самом деле нигде не вижу в вашем коде - где он?) Имеет collisionDelegate свойство, и именно это должно быть установлено в self,

Другие вопросы по тегам