在开始之前,让我们提醒一下,原点是视图的左上角CGPoint。
了解观点和父母很重要。
让我们看一下这个简单的代码,一个视图控制器,它在视图中添加了一个黑色方块:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
createDummyView()
super.view.backgroundColor = UIColor.cyanColor();
}
func createDummyView(){
var subView = UIView(frame: CGRect(x: 15, y: 50, width: 50 , height: 50));
super.view.addSubview(subView);
view.backgroundColor = UIColor.blackColor()
}
}
这将创建这个视图:
黑色矩形的原点和中心与父级的坐标相同
现在让我们尝试将 subView 添加另一个 SubSubView,并赋予 subSubview 与 subView 相同的来源,但让 subSubView 成为 subView 的子视图
我们将添加此代码:
var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)
结果如下:
因为这条线:
subSubView.frame.origin = subView.frame.origin;
您希望紫色矩形的原点与其父矩形(黑色矩形)相同,但它位于其下方,这是为什么呢?
因为当您将视图添加到另一个视图时,子视图框架“世界”现在是它的父 BOUND RECTANGLE,如果您认为它在主屏幕上的原点在所有子视图的坐标 (15,15) 处,则左上角将是 (0,0)
这就是为什么你需要始终通过它的绑定矩形来引用父级,这是它的子视图的“世界”,让我们将这一行修复为:
subSubView.frame.origin = subView.bounds.origin;
看看神奇的是,subSubview 现在正好位于它的父原点:
所以,你喜欢“好吧,我只想以我父母的观点为中心,有什么大不了的?”
好吧,这没什么大不了的,您只需要将从框架中获取的父中心点“翻译”到父边界中心
通过这样做:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
您实际上是在告诉他“获取父母视图中心,并将其转换为 subSubView 世界”。
你会得到这个结果: