Antes de começarmos, lembremos que o ponto de origem é o canto superior esquerdo CGPoint
de uma visualização. Uma coisa importante a entender sobre pontos de vista e pais.
Vamos dar uma olhada neste código simples, um controlador de exibição que adiciona um quadrado preto:
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()
}
}
Isso criará esta visualização: a origem e o centro do retângulo preto se encaixam nas mesmas coordenadas do pai.

Agora vamos tentar adicionar subView outro SubSubView e dar ao subSubview a mesma origem do subView, mas tornar o subSubView uma visão filho do subView
Adicionaremos este código:
var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)
E este é o resultado:

Devido a esta linha:
subSubView.frame.origin = subView.frame.origin;
Você espera que a origem do retângulo roxo seja a mesma de seu pai (o retângulo preto), mas fica abaixo dele, e por que isso? Como quando você adiciona uma visualização a outra, o quadro "mundo" do subView agora é o pai BOUND RECTANGLE, se você tem uma visão de que sua origem na tela principal está nas cordas (15,15) para todas as sub-vistas, o o canto superior esquerdo será (0,0)
É por isso que você sempre precisa se referir a um pai pelo retângulo vinculado, que é o "mundo" de seus subViews, vamos corrigir esta linha para:
subSubView.frame.origin = subView.bounds.origin;
E veja a mágica, o subSubview agora está localizado exatamente em sua origem pai:

Então, você gosta de "ok, eu só queria centralizar minha visão pela visão de meus pais, qual é o problema?" bem, não é grande coisa, você só precisa "traduzir" o ponto central pai, que é retirado de seu quadro para o centro de limites dos pais, fazendo o seguinte:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
Na verdade, você está dizendo a ele "pegue o centro de visualização dos pais e converta-o no mundo subSubView".
E você obterá este resultado:
