原文链接:
https://juejin.cn/post/6844904132415864845
frame是相对于父view参照系(是父view而不是父viewController)的,bounds是本地参照系,改frame的时候center和bounds联动,但改bounds的时候center不动。
先上一段代码,创建红色和绿色方块,设置好frame
override funcviewDidLoad() { super.viewDidLoad()letred = UIView.init(frame: CGRect(x: 50, y: 50, width: 200, height: 200)) red.backgroundColor = UIColor.red self.view.addSubview(red)letgreen = UIView.init(frame: CGRect(x: 50, y: 50, width: 50, height: 50)) green.backgroundColor = UIColor.green red.addSubview(green) }复制代码
结果显示
接着添加一行修改green的bounds
letred = UIView.init(frame: CGRect(x: 50, y: 50, width: 200, height: 200)) red.backgroundColor = UIColor.red self.view.addSubview(red)letgreen = UIView.init(frame: CGRect(x: 50, y: 50, width: 50, height: 50)) green.backgroundColor = UIColor.green red.addSubview(green) green.bounds = CGRect(x: -50, y: -50, width: 50, height: 50)复制代码
可以看到,从视觉上来看并没有什么变化,这就是开头所说的“改bounds的时候center不动”:
删掉修改green的代码,再修改一下red的bound呢:
letred = UIView.init(frame: CGRect(x: 50, y: 50, width: 200, height: 200)) red.backgroundColor = UIColor.red self.view.addSubview(red)letgreen = UIView.init(frame: CGRect(x: 50, y: 50, width: 50, height: 50)) green.backgroundColor = UIColor.green red.addSubview(green) red.bounds = CGRect(x: -50, y: -50, width: 200, height: 200)复制代码
可以看到居然是绿色方块动了。原因还是开头那句话"改bounds的时候center不动",修改了red的bounds,但是只修改了x和y值,没有修改宽高,在center不动的情况下,宽高不变的话,red本身看起来是没有变化的。
但是它的bounds却影响到了green的位置,因为此时,red的左上角顶点的左边已经是(x:-50,y:-50)了,而“frame是相对于父view参照系”的,其子视图green的frame是CGRect(x: 50, y: 50, width: 50, height: 50),所以green相对于red来说,x:50,y:50其实是相对于red的左上角顶点移动了50-(-50)=100的距离,所以会是上图看起来的样子.
(”所以green相对于red来说,x:50,y:50其实是相对于red的左上角顶点移动了50-(-50)=100的距离“ -- 通过这句话我理解了,这样看来的话,就是原来坐标原点的值是(0,0),现在坐标原点的值是 (-50, -50)了,而frame是的x y 是相对于坐标原点来说的)