- 设置
frame
相当于设置了view
在superview
坐标系中的大小和位置,严格来说是center
和bounds
的一种便捷设置 -
bounds
代表了当前view
的坐标系(view
的大小和view
坐标系的起点,不要轻易修改bounds
的origin
) -
center
表示在superview
坐标系中的位置(设置center
之前应该首先设置bounds)superview
和当前view
坐标系的连接关系是canter
,基于这个事实,不同坐标系上的点可以进行相互转换 - 如果使用
center
来设置view
的位置时,当该view
的宽或高不是整数,该view
边缘可能坐落在频幕的像素点之间,可能导致视图模糊,可以使用下面的代码来调整view
的frame
:v.frame = v.frame.integral
- 不同级别之间的
view
可能要进行包含范围的判断,可能需要用到坐标转换,UIView
提供了下面四个方法进行坐标转换
open func convert(_ point: CGPoint, to view: UIView?) -> CGPoint
open func convert(_ point: CGPoint, from view: UIView?) -> CGPoint
open func convert(_ rect: CGRect, to view: UIView?) -> CGRect
open func convert(_ rect: CGRect, from view: UIView?) -> CGRect
上面的方法中的view
参数如果传入nil
默认是self.view.window
,在viewDidLoad
方法中self.view.window
是nil
(view
的window
属性有无可以表示当前view
是否在界面上, viewDidLoad
界面还没有显示出来)
有了上面坐标系的概念,上面的方法可以理解为:
原坐标系to
目标坐标系
目标坐标系from
原坐标系
所以转换某个view
的frame
(superview
坐标系中的位置)到指定的view
一般使用view.superview
调用to
方法或者指定view
调用frome
方法
class ViewController: UIViewController {
let v1 = UIView(frame: CGRect(x: 50, y: 50, width: 100, height: 100))
var v2 = UIView(frame: CGRect(x: 50, y: 50, width: 60, height: 60))
var v3 = UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
override func viewDidLoad() {
super.viewDidLoad()
v1.backgroundColor = UIColor.blue
v2.backgroundColor = UIColor.gray
v3.backgroundColor = UIColor.red
view.addSubview(v1)
view.addSubview(v2)
v2.addSubview(v3)
let point = v2.convert(v3.center, to: view)
let point = view.convert(v3.center, from: v2)
}
//下面这个方法便于理解和使用
let point = v1.convert(v3.center, from: v3.superview)
convert(_ point: CGPoint, to view: UIView?) -> CGPoint
方法的调用者是该点所在view
的supview
,to
后面传入需要转换到的视图,convert(_ point: CGPoint, from view: UIView?) -> CGPoint
正好相反
UIView
有一个方法func point(inside point: CGPoint, with event: UIEvent?) -> Bool
可以判断点是否在view
中