Bevor wir beginnen, möchten wir Sie nur daran erinnern, dass der Ursprungspunkt die obere linke Ecke CGPoint
einer Ansicht ist. Eine wichtige Sache, um über Ansichten und Eltern zu verstehen.
Schauen wir uns diesen einfachen Code an, einen Ansichts-Controller, der seiner Ansicht ein schwarzes Quadrat hinzufügt:
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()
}
}
Dadurch wird diese Ansicht erstellt: Der Ursprung und die Mitte des schwarzen Rechtecks passen zu denselben Koordinaten wie das übergeordnete Element
Versuchen wir nun, subView eine weitere SubSubView hinzuzufügen und subSubview denselben Ursprung wie subView zuzuweisen, machen subSubView jedoch zu einer untergeordneten Ansicht von subView
Wir werden diesen Code hinzufügen:
var subSubView = UIView();
subSubView.frame.origin = subView.frame.origin;
subSubView.frame.size = CGSizeMake(20, 20);
subSubView.backgroundColor = UIColor.purpleColor()
subView.addSubview(subSubView)
Und das ist das Ergebnis:
Wegen dieser Zeile:
subSubView.frame.origin = subView.frame.origin;
Sie erwarten, dass der Ursprung des lila Rechtecks mit dem des übergeordneten Rechtecks (dem schwarzen Rechteck) identisch ist, aber er geht darunter, und warum ist das so? Wenn Sie einer anderen Ansicht eine Ansicht hinzufügen, ist der SubView-Frame "world" jetzt das übergeordnete BOUND RECTANGLE. Wenn Sie die Ansicht haben, dass der Ursprung auf dem Hauptbildschirm für alle Unteransichten in Koordinaten (15,15) liegt, ist der obere linke Ecke ist (0,0)
Aus diesem Grund müssen Sie immer auf ein übergeordnetes Element verweisen, indem es ein gebundenes Rechteck bildet, das die "Welt" seiner Unteransichten darstellt. Lassen Sie uns diese Zeile auf Folgendes korrigieren:
subSubView.frame.origin = subView.bounds.origin;
Und sehen Sie die Magie, die Unteransicht befindet sich jetzt genau in ihrem übergeordneten Ursprung:
Du magst also "ok, ich wollte meine Sicht nur auf die Sicht meiner Eltern zentrieren, was ist die große Sache?" Nun, es ist keine große Sache, Sie müssen nur den übergeordneten Mittelpunkt "übersetzen", der von seinem Rahmen zum übergeordneten Grenzzentrum genommen wird, indem Sie Folgendes tun:
subSubView.center = subView.convertPoint(subView.center, fromView: subSubView);
Sie sagen ihm tatsächlich: "Nehmen Sie das Eltern-Ansichtszentrum und konvertieren Sie es in die subSubView-Welt."
Und Sie erhalten dieses Ergebnis: