Matt Bart Matt Bart - 3 months ago 19
Swift Question

CollisionBehavior not being called

I have been trying to get this CollisionBehavior func to run.

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")
}


As you can see I tried both collisionBehavior methods. The ball and blocks are all dynamic objects and I have the screen ends being a boundary. So every time a block or "ball" hits another block, paddle, ball, or the end of the screen, it should print "colliding", but nothing gets printed to the terminal. Below is the code for the block, ball, paddle, and boundaries.

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()
}


Ball:

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)


}


Blocks and Screen End (boundary):

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)

}


Thanks for any help

Answer

Your lazy var is not going to work. An object (self) does not somehow magically raise its hand and say "Look at me, I am the collision delegate!" That isn't how delegation operates.

The UICollisionBehavior object (which I don't actually see anywhere in your code — where is it?) has a collisionDelegate property, and it is this that must be set to self.

Comments