Перш ніж розпочати, нагадаємо, що точка початку - верхній лівий кут 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;
Ви очікуєте, що походження фіолетового прямокутника буде таким самим, як його батьківське (чорний прямокутник), але воно йде під ним, і чому це так? Оскільки, коли ви додаєте подання до іншого виду, кадр subView "світ" тепер є батьківським BOUND RECTANGLE, якщо у вас є подання, що його походження на головному екрані знаходиться в координатах (15,15) для всіх його переглядів, лівий верхній кут буде (0,0)
Ось чому вам потрібно завжди звертатися до батька за його зв'язаним прямокутником, який є "світом" його subView, дозволяє виправити цю лінію на:
subSubView.frame.origin = subView.bounds.origin;
І подивіться на магію, підрозгляд тепер розташований саме в його батьківському походженні:
Отже, вам подобається, що "добре, я хотів лише зосередити свій погляд на моїх батьківських уявленнях, у чому полягає головна справа?" ну, це не велика справа, вам просто потрібно "перевести" батьківську точку Центру, яка взята з її фрейму, до центру меж батьків, роблячи це:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
Ви насправді говорите йому: "Візьміть батьківський оглядовий центр та перетворіть його у світ subSubView".
І ви отримаєте такий результат: