Zanim zaczniemy, przypomnijmy tylko, że punkt początkowy to lewy górny róg CGPoint
widoku. Ważna rzecz do zrozumienia o poglądach i rodzicach.
Przyjrzyjmy się temu prostemu kodowi, kontrolerowi widoku, który dodaje do widoku czarny kwadrat:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
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()
}
}
Stworzy to taki widok: początek i środek czarnego prostokąta pasują do tych samych współrzędnych, co jego rodzic
Teraz spróbujmy dodać subView inny SubSubView i nadając subSubview to samo źródło co subView, ale uczyń subSubView widokiem potomnym subView
Dodamy ten kod:
var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)
A oto wynik:
Z powodu tej linii:
subSubView.frame.origin = subView.frame.origin;
Spodziewasz się, że pochodzenie fioletowego prostokąta będzie takie samo jak jego rodzic (czarny prostokąt), ale znajduje się pod nim, a dlaczego tak jest? Ponieważ kiedy dodajesz widok do innego widoku, „świat” ramki widoku podrzędnego jest teraz jego nadrzędnym PROSTOKĄTEM OGRANICZONYM. w lewym górnym rogu będzie (0,0)
Dlatego zawsze musisz odnosić się do rodzica przez powiązany prostokąt, który jest „światem” jego podwidoków, naprawmy tę linię tak, aby:
subSubView.frame.origin = subView.bounds.origin;
I zobacz magię, subSubview znajduje się teraz dokładnie w swoim nadrzędnym źródle:
Więc lubisz "ok, chciałem skupić się tylko na poglądach moich rodziców, o co chodzi?" cóż, to nic wielkiego, wystarczy "przetłumaczyć" nadrzędny punkt środkowy, który jest przenoszony z ramki do środka granic rodzica, wykonując następujące czynności:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
Właściwie mówisz mu „weź centrum widoku rodziców i przekształć je w świat subSubView”.
Otrzymasz taki wynik: