浅谈视图的frame、bounds和center属性

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属性,代表了子视图在父视图中的位置,以父视图的坐标系统。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值