如果你在用swift的get创建subview那么小心了,你每次使用该对象时都会重新初始化,你在其他地方相同属性代码会被覆盖。
举例说明:
我在这里初始化BallView
var ballView:BallView{
let ballView = BallView(frame: CGRect(origin: CGPoint(x:self.center.x-40,y:self.center.y - 40), size: CGSize(width: 80, height: 80)))
ballView.backgroundColor = UIColor.white;
return ballView;
}
override func layoutSubviews() {
super.layoutSubviews()
let originX = (self.width-self.paddleSize.width)/2.0
let orignY = self.hight - 20-self.paddleSize.height;
let origin = CGPoint(x:originX,y:orignY)
paddleView = UIView(frame:CGRect(origin: origin, size: paddleSize));
paddleView!.backgroundColor = UIColor.orange;
self.addSubview(paddleView!)
self.addSubview(ballView);
self.addBallFallingBehavior();
}
erminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'View item (<DropProjectsGame.BallView: 0x7fd5697137d0; frame = (167 303.5; 80 80); layer = <CALayer: 0x60000023d800>>) should be a descendant of reference view in <UIDynamicAnimator: 0x7fd56941d460> Stopped (0.000000s) in <(null): 0x0> {{0, 0}, {80, 80}}'
我就纳闷了,明明就
self.addSubview(ballView);
还报错ballView不从属于UIDynamicAnimator的
referenceView.
原因在这里
func addBallFallingBehavior(){
dynamicAnimator.addBehavior(objectBehavior);
objectBehavior.addGravityCollisionForItems(items: [self.ballView]);
}
正确的修正不要使用get方法初始化View
var ballView:BallView = {
let ballView = BallView()
ballView.backgroundColor = UIColor.white;
return ballView;
}()
这样就行了