iOS frame与bounds到底有什么区别

2016-11-19  本文已影响180人  丶丶夏天

frame是相对于父view参照系(是父view而不是父viewController)的,bounds是本地参照系,改frame的时候center和bounds联动,但改bounds的时候center不动。
先上一段代码,创建红色和绿色方块,设置好frame

override func viewDidLoad() {
        super.viewDidLoad()

        let red = UIView.init(frame: CGRect(x: 50, y: 50, width: 200, height: 200))
        red.backgroundColor = UIColor.red
        self.view.addSubview(red)
        
        let green = UIView.init(frame: CGRect(x: 50, y: 50, width: 50, height: 50))
        green.backgroundColor = UIColor.green
        red.addSubview(green)
    }

结果显示


Simulator Screen Shot 2016年11月19日 上午10.09.43.png

接着添加一行修改green的bounds


 let red = UIView.init(frame: CGRect(x: 50, y: 50, width: 200, height: 200))
        red.backgroundColor = UIColor.red
        self.view.addSubview(red)
        
        let green = 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不动”:


Simulator Screen Shot 2016年11月19日 上午10.12.19.png

删掉修改green的代码,再修改一下red的bound呢:


 let red = UIView.init(frame: CGRect(x: 50, y: 50, width: 200, height: 200))
        red.backgroundColor = UIColor.red
        self.view.addSubview(red)
        
        let green = 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)

Simulator Screen Shot 2016年11月19日 上午10.14.53.png

可以看到居然是绿色方块动了。原因还是开头那句话"改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的距离,所以会是上图看起来的样子.

上一篇下一篇

猜你喜欢

热点阅读