UIView的bounds属性定义了UIView本身的坐标系统,UIView的center属性则在UIView的bounds和superview的bounds之间建立了位置关系,即center决定了UIView在其superview中的位置。
以下代码添加了一个subview内嵌在一个view中
<span style="font-family:Microsoft YaHei;"> var v1 = UIView(frame: CGRectMake(100, 100, 300, 300))
v1.backgroundColor = UIColor.grayColor()
var v2 = UIView(frame: CGRectInset(v1.bounds, 50, 50))
v2.backgroundColor = UIColor.redColor()
view.addSubview(v1)
v1.addSubview(v2)</span>
改变v2的bounds的size,v2变大,但bounds的改变不会影响center的值,v2的center不变,即v2的位置不变:
<span style="font-family:Microsoft YaHei;"> var v1 = UIView(frame: CGRectMake(100, 100, 300, 300))
v1.backgroundColor = UIColor.grayColor()
var v2 = UIView(frame: CGRectInset(v1.bounds, 50, 50))
v2.backgroundColor = UIColor.redColor()
view.addSubview(v1)
v1.addSubview(v2)
var b = v2.bounds
b.size.width = b.size.width + 80
b.size.height = b.size.height + 80
v2.bounds = b</span>
但改变v1.bounds.origin时,v2的位置变了
<span style="font-family:Microsoft YaHei;"> var v1 = UIView(frame: CGRectMake(100, 100, 300, 300))
v1.backgroundColor = UIColor.grayColor()
var v2 = UIView(frame: CGRectInset(v1.bounds, 50, 50))
v2.backgroundColor = UIColor.redColor()
v2.alpha = 0.8
view.addSubview(v1)
v1.addSubview(v2)
var b = v1.bounds
b.origin.x = 100
b.origin.y = 100
v1.bounds = b</span>
bounds.origin 定义了view自身的左上角在自己的坐标系统中的坐标,而subview的center则遵循view的坐标系统,于是view的(0,0)坐标此时在图中的小红圈位置,v2的center在这个变化后的坐标系统中向左和向上移动了100。
可见,不同view有自身的坐标系统,下面两个函数提供了在不同坐标之间进行转化的方法
convertPoint:fromView:
convertPoint:toView:
例如,要使subview(v2)处于view(v1)的中间位置,可以这样写:
v2.center = v1.convertPoint(v1.center, fromView: v1.superview)
v1.convertPoint(v1.center, fromView: v1.superview) 的含义是将 在 v1.superview 的坐标系统中的 v1.center 这个点 转化为在v1中的坐标
等价地,可以写成 v1.superview?.convertPoint(v1.center, toView: v1)
<span style="font-family:Microsoft YaHei;"> var v1 = UIView(frame: CGRectMake(100, 100, 300, 300))
v1.backgroundColor = UIColor.grayColor()
var v2 = UIView(frame: CGRectMake(0, 0, 100, 100))
v2.backgroundColor = UIColor.redColor()
v2.alpha = 0.8
view.addSubview(v1)
v1.addSubview(v2)
//v2.center = v1.convertPoint(v1.center, fromView: v1.superview) //与下面的方法等价
v2.center = (v1.superview?.convertPoint(v1.center, toView: v1))!</span>
下面两个函数转化的是矩形,原理是一样的:
convertRect:fromView:
convertRect:toView: