Avant de commencer, rappelons simplement que le point d'origine est le coin supérieur gauche CGPoint
d'une vue. Une chose importante à comprendre sur les opinions et les parents.
Jetons un œil à ce code simple, un contrôleur de vue qui ajoute à sa vue un carré noir:
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()
}
}
Cela créera cette vue: l'origine et le centre du rectangle noir correspondent aux mêmes coordonnées que son parent
Essayons maintenant d'ajouter une sous-vue à une autre sous-vue, et en donnant à la sous-vue la même origine que la sous-vue, mais en faisant de la sous-vue une vue enfant de la sous-vue
Nous ajouterons ce code:
var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)
Et voici le résultat:
En raison de cette ligne:
subSubView.frame.origin = subView.frame.origin;
Vous vous attendez à ce que l'origine du rectangle violet soit la même que son parent (le rectangle noir), mais il passe en dessous, et pourquoi? Parce que lorsque vous ajoutez une vue à une autre vue, le cadre de sous-vue "monde" est maintenant son parent BOUND RECTANGLE, si vous avez une vue dont l'origine sur l'écran principal est aux coordonnées (15,15) pour toutes ses sous-vues, le le coin supérieur gauche sera (0,0)
C'est pourquoi vous devez toujours faire référence à un parent par son rectangle lié, qui est le "monde" de ses sous-vues, fixons cette ligne à:
subSubView.frame.origin = subView.bounds.origin;
Et voyez la magie, la sous-vue est maintenant située exactement dans son origine parent:
Alors, vous aimez "ok, je voulais seulement centrer mon point de vue sur le point de vue de mes parents, quel est le problème?" eh bien, ce n'est pas grave, vous avez juste besoin de "traduire" le point central parent qui est pris de son cadre au centre des limites du parent en faisant ceci:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
Vous lui dites en fait "prenez le centre de vue des parents et convertissez-le en monde subSubView".
Et vous obtiendrez ce résultat: