【转】iOS frame与bounds到底有什么区别

原文链接:

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 是相对于坐标原点来说的)

你可能感兴趣的:(【转】iOS frame与bounds到底有什么区别)