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