Antes de comenzar, recordemos que el punto de origen es la esquina superior izquierda CGPoint
de una vista. Una cosa importante para entender sobre las opiniones y los padres.
Echemos un vistazo a este código simple, un controlador de vista que agrega a su vista un cuadrado negro:
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()
}
}
Esto creará esta vista: el origen y centro del rectángulo negro se ajusta a las mismas coordenadas que su padre
Ahora intentemos agregar subView a otro SubSubView y darle a subSubview el mismo origen que subView, pero haga que subSubView sea una vista secundaria de subView
Agregaremos 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)
Y este es el resultado:
Debido a esta línea:
subSubView.frame.origin = subView.frame.origin;
Esperas que el origen del rectángulo púrpura sea el mismo que el padre (el rectángulo negro) pero se encuentra debajo de él, y ¿por qué es eso? Debido a que cuando agrega una vista a otra vista, el "mundo" del marco subView ahora es su RECTÁNGULO CONDUCIDO padre, si tiene una vista de que su origen en la pantalla principal está en las coordenadas (15,15) para todas sus vistas secundarias, el la esquina superior izquierda será (0,0)
Es por eso que siempre debe referirse a un padre por su rectángulo encuadernado, que es el "mundo" de sus subVistas, arreglemos esta línea para:
subSubView.frame.origin = subView.bounds.origin;
Y vea la magia, la subvista secundaria ahora se encuentra exactamente en su origen principal:
Entonces, te gusta "ok, solo quería centrar mi punto de vista por el de mis padres, ¿cuál es el problema?" bueno, no es gran cosa, solo necesitas "traducir" el punto central principal que se toma de su marco al centro de límites de los padres haciendo esto:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
En realidad le estás diciendo "toma el centro de visualización de los padres y conviértelo en el mundo subSubView".
Y obtendrás este resultado: