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的距离,所以会是上图看起来的样子.
网友评论