frame与bounds
frame定义了一个view相对于父视图坐标系的位置和大小,它会影响center属性和bounds属性的size。
这里需要做个特殊说明,frame的坐标是相对于父视图坐标系的,所以在设置的时候需要明白,父视图是什么,一个View的父视图就是这个view被谁addSubview了。如果view1. addSubview(view2) view2. addSubview(view3) 那么view3的父视图就是view2,而不是view1
Bounds也是描述的是视图的位置和大小,只不过是在自己的坐标系上。也就是说它描述的是当前视图相对于自身坐标系的位置和大小。
简而言之,就是frame和bounds的width和height是一样的,唯独坐标是不一样,frame的坐标是相对于父视图的,bounds是相对于自己的。
下面举个例子看一下:
let view1 = UIView(frame: CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight/3))
view1.backgroundColor = UIColor.blue
print("view1.frame:",view1.frame)
print("view1.bounds:",view1.bounds)
self.view.addSubview(view1)
let view2 = UIView(frame: CGRect(x: 0, y: screenHeight/3, width: screenWidth, height: screenHeight/3))
view2.backgroundColor = UIColor.red
print("view2.frame:",view2.frame)
print("view2.bounds:",view2.bounds)
self.view.addSubview(view2)
let view3 = UIView(frame: CGRect(x: 0, y: view2.frame.maxY, width: screenWidth, height: screenHeight/3))
view3.backgroundColor = UIColor.yellow
print("view3.frame:",view3.frame)
print("view3.bounds:",view3.bounds)
self.view.addSubview(view3)
let view4 = UIView()
view4.frame = CGRect(x: view3.bounds.minX, y: view3.bounds.minY, width: 100, height: 100)
view4.backgroundColor = UIColor.brown
view3.addSubview(view4)
view1与view2,view3 平分屏幕,它们的父视图就是self.view
而view4 是view3中的一个view,他的父视图是view3。
所以这时,在对view3设置y坐标的时候,用的是view2.frame,因为他俩是平级的设置的坐标都是相对于父视图的
而对view4设置坐标的时候用的是view3.bounds,因为view4是view3的子视图,view4的坐标原点(0,0)是view3的左上角,他的所有坐标都是相对于view3的左上角。所以此时可以使用view.bounds。
可以看一下效果:
image.png
假设,如果这里不用view3.bounds而是用view3.frame可以看一下,上图中棕色的小方块便不会出现。
这是因为view的数据坐标如下:
view3.frame: (0.0, 490.666666666667, 414.0, 245.333333333333)
view3.bounds: (0.0, 0.0, 414.0, 245.333333333333)
这说明view3.frame.minY为490.666666666667,设置给view4以后,他相对于view左上角的y坐标为490.666666666667,这样肯定不会显示出来了。
综合上面的例子可以很容易理解frame与bounds的关系了吧。
更多内容关注我的公众号:
image
网友评论