Xcode中的文档描述如下:
public var frame: CGRect
:public var bounds: CGRect
:默认下,bounds是zero origin,frame size。public var center: CGPoint
:center是frame的中心点。
视图的frame
属性,类型是CGRect
,代表了在父视图坐标系统下的矩形的位置、尺寸。如果你想为一个视图设置一个标准的尺寸的话,特别是尺寸与内容相关(例如,UIButton与上面的title相关),你可以使用public func sizeToFit()
方法。
假如我们有一个父视图和子视图,并且子视图距离父视图的四周为10 points。
上图的效果可以使用下面的函数实现:
public func CGRectInset(rect: CGRect, _ dx: CGFloat, _ dy: CGFloat) -> CGRect
或者使用CGRect的方法实现:
public func insetBy(dx dx: CGFloat, dy: CGFloat) -> CGRect
上面的函数或方法都需要一个CGRect实例,那么到底这个实例是哪个呢?记住,并不是父视图的frame(要清楚视图的frame代表的是它在父视图中的位置,并且是以父视图的坐标系统的)。我们要的是一个CGRect实例,描述我们的父视图,以自己的坐标系统。那么视图的bounds
属性就是一个CGRect实例,以自己的坐标系统来描述自身的位置、尺寸。
上面图示效果代码如下:
override func viewDidLoad() {
super.viewDidLoad()
self.sup=UIView(frame: CGRectMake(100,100,100,200))
self.sup!.backgroundColor=UIColor.greenColor()
self.view.addSubview(self.sup!)
//let sub2=UIView(frame: CGRectInset(self.sup!.bounds,10,10))
let sub2=UIView(frame: self.sup!.frame.insetBy(dx: 10, dy: 10))
sub2.backgroundColor=UIColor.yellowColor()
self.sup!.addSubview(sub2)
self.view.addSubview(sup!)
}
当你设置视图的bounds时,有趣的事情发生了!如果你改变视图的bounds
尺寸(即bounds.size
)时,你就会改变它的frame
,frame的改变发生在中心的四周,但是中心点保持不变。示例代码如下:
self.sup=UIView(frame: CGRectMake(100,100,100,200))
self.sup!.backgroundColor=UIColor.greenColor()
self.view.addSubview(self.sup!)
//let sub2=UIView(frame: CGRectInset(self.sup!.bounds,10,10))
let sub2=UIView(frame: self.sup!.bounds.insetBy(dx: 10, dy: 10))
sub2.backgroundColor=UIColor.yellowColor()
self.sup!.addSubview(sub2)
sub2.bounds.size.width+=20
sub2.bounds.size.height+=20
self.view.addSubview(sup!)
运行后,你会发生只有一个矩形,子视图完全覆盖了父视图。中心点并没有移动:
当你创建一个视图时,它的bounds坐标系统原点(0.0,0.0)是在左上角。如果你改变了视图的bounds的origin(起始点),你就会移动它内部的坐标系统的起始点。因为子视图是对于父视图自身的坐标系统来放置的,所以父视图的bounds的origin改变子视图的显示位置。下面的代码可以证明我们的说法:
self.sup=UIView(frame: CGRectMake(100,100,100,200))
self.sup!.backgroundColor=UIColor.greenColor()
self.view.addSubview(self.sup!)
let sub2=UIView(frame: self.sup!.bounds.insetBy(dx: 10, dy: 10))
sub2.backgroundColor=UIColor.yellowColor()
self.sup!.addSubview(sub2)
self.sup!.bounds.origin.x+=10
self.sup!.bounds.origin.y+=10
self.view.addSubview(sup!)
父视图的尺寸和位置没有什么变化,但是子视图往左上角发生了移动。我们改变一个视图的bounds的origin时,那么在该视图自身的坐标系统中,左上角的坐标发生了改变。
视图的center
属性,代表了子视图在父视图中的位置,以父视图的坐标系统。