直接上代码:
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;
ballView.frame = CGRect(origin: CGPoint(x:self.center.x-BallSize.width/2 ,y:self.center.y - BallSize.width/2), size: CGSize(width: BallSize.width, height: BallSize.width));
self.addSubview(ballView);
self.addSubview(paddleView!)
}
这是页面开始时,对paddleView设置了一个初始位置,然而我对其添加了panGuesture,手势移动,则ballView也跟着移动。
func handPan(_ sender:UIPanGestureRecognizer) {
let state = sender.state;
let touchPoint:CGPoint = sender.location(in: self);
switch state {
case .began:
break;
case .changed:
var touchX:CGFloat = touchPoint.x;
if touchX < paddleSize.width / 2 {
touchX = paddleSize.width/2;
}
if touchX > self.width - paddleSize.width/2 {
touchX = self.width - paddleSize.width/2
}
paddleView!.center = CGPoint(x: touchX, y: paddleView!.center.y);
breakObjectBehavior.removeBundry(name:PathNames.paddleBundryName as NSCopying)
addBundry();
// print("volocity:\(sender.velocity(in: self))")
breakBehaviorDataSource.pushAngle = checkingAngle(velocity: sender.velocity(in: self))
// print("angle:\(breakBehaviorDataSource.pushAngle)")
break;
default:
break;
}
}
由于在手势处理函数中对paddle设置了新的位置,UIKIT自动调用layoutSubviews方法,导致设置无效。
这里要么使用全局变量来设置subview的位置,要么更改初始化的位置:
override init(frame: CGRect) {
super.init(frame: frame)
}
然后viewController 初始化View时一定要调用init(frame)方法