美文网首页
iOS frame与bounds到底有什么区别

iOS frame与bounds到底有什么区别

作者: 丶丶夏天 | 来源:发表于2016-11-19 10:21 被阅读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的距离,所以会是上图看起来的样子.

    相关文章

      网友评论

          本文标题:iOS frame与bounds到底有什么区别

          本文链接:https://www.haomeiwen.com/subject/uhospttx.html