Prima di iniziare, ricordiamo solo che il punto di origine è l'angolo in alto a sinistra CGPointdi una vista. Una cosa importante da capire su punti di vista e genitori.
Diamo un'occhiata a questo semplice codice, un controller di visualizzazione che aggiunge alla sua visualizzazione un quadrato nero:
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()
}
}
Questo creerà questa vista: l'origine e il centro del rettangolo nero si adattano alle stesse coordinate del genitore

Ora proviamo ad aggiungere subView un altro SubSubView e dando a subSubview la stessa origine di subView, ma facciamo di subSubView una vista figlio di subView
Aggiungeremo questo codice:
var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)
E questo è il risultato:

A causa di questa linea:
subSubView.frame.origin = subView.frame.origin;
Ti aspetti che l'origine del rettangolo viola sia la stessa del suo genitore (il rettangolo nero) ma ci passa sotto e perché? Perché quando aggiungi una vista a un'altra vista, il frame "world" di subView ora è il RECTANGLE RILEVATO padre, se hai una vista che la sua origine nella schermata principale è a coords (15,15) per tutte le sue viste secondarie, il l'angolo in alto a sinistra sarà (0,0)
Questo è il motivo per cui devi sempre fare riferimento a un genitore per il suo rettangolo rilegato, che è il "mondo" delle sue viste secondarie, consente di correggere questa riga su:
subSubView.frame.origin = subView.bounds.origin;
E vedi la magia, il subSubview ora si trova esattamente nella sua origine padre:

Quindi, ti piace "ok, volevo solo centrare la mia visione con quella dei miei genitori, qual è il grosso problema?" beh, non è un grosso problema, devi solo "tradurre" il punto centrale del genitore che viene preso dalla sua cornice al centro dei limiti del genitore facendo questo:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
In realtà gli stai dicendo "prendi il centro di visualizzazione dei genitori e convertilo nel mondo subSubView".
E otterrai questo risultato:
