UIView
hat die Eigenschaften frame
, bounds
, center
und Origin
, und sie scheinen alle miteinander in Beziehung zu stehen. Die meiste Zeit beschäftige ich mich mit frame
, wenn ich die Position und Größe eines UIView
festlege. Ich verstehe, dass frame
das globale Koordinatensystem verwendet und bounds
die Koordinate der lokalen Ansicht verwendet (daher sind x und y 0, aber nicht immer), aber es ist mir immer noch unklar, wann benutze was.
In welchem Kontext (und zu welchem Zeitpunkt) sollten die anderen Eigenschaften (bounds
, center
, Origin
) verwendet werden?
Die obige Antwort von Marco ist richtig, aber nur um die Frage "unter welchem Kontext" zu erweitern ...
frame - dies ist die Eigenschaft, die Sie am häufigsten für normale iPhone-Anwendungen verwenden. Die meisten Steuerelemente werden relativ zum "enthaltenden" Steuerelement angeordnet, sodass der Frame direkt der Position entspricht, an der das Steuerelement angezeigt werden soll, und Frame.size bestimmt, wie groß das Steuerelement sein soll.
center - Dies ist die Eigenschaft, auf die Sie sich wahrscheinlich bei Sprite-basierten Spielen und Animationen konzentrieren werden, bei denen Bewegungen oder Skalierungen auftreten können. Standardmäßig werden Animation und Drehung auf der Mitte von UIView basieren. Es ist selten sinnvoll, solche Objekte über die Frame-Eigenschaft zu verwalten.
bounds - Diese Eigenschaft ist keine Positioniereigenschaft, sondern definiert den Zeichenbereich von UIView "relativ" zum Frame. Standardmäßig ist diese Eigenschaft normalerweise (0, 0, Breite, Höhe). Durch Ändern dieser Eigenschaft können Sie außerhalb des Rahmens zeichnen oder das Zeichnen auf einen kleineren Bereich innerhalb des Rahmens beschränken. Eine gute Diskussion dazu finden Sie unter dem unten stehenden Link. Es ist ungewöhnlich, dass diese Eigenschaft bearbeitet wird, es sei denn, der Zeichenbereich muss speziell angepasst werden. Die einzige Ausnahme ist, dass die meisten Programme das [[UIScreen mainScreen] bounds]
beim Start, um den sichtbaren Bereich für die Anwendung zu bestimmen und den ursprünglichen UIView-Frame entsprechend einzurichten.
Warum gibt es in einer UIView ein Rahmen- und ein Begrenzungsrechteck?
Hoffentlich hilft dies dabei, die Umstände zu klären, unter denen die einzelnen Eigenschaften möglicherweise genutzt werden.
Sie sind verwandte Werte und werden von den Eigenschaften-Setter/Getter-Methoden konsistent gehalten (und verwenden die Tatsache, dass Frame ein rein synthetisierter Wert ist, der nicht durch eine tatsächliche Instanzvariable unterstützt wird).
Die Hauptgleichungen sind:
frame.Origin = center - bounds.size / 2
(das ist das gleiche wie)
center = frame.Origin + bounds.size / 2
(und es gibt auch)
frame.size = bounds.size
Das ist kein Code, nur Gleichungen, um die Invariante zwischen den drei Eigenschaften auszudrücken. Diese Gleichungen setzen auch voraus, dass die Transformation Ihrer Ansicht die Identität ist, die sie standardmäßig ist. Wenn dies nicht der Fall ist, behalten Begrenzungen und Mittelpunkt dieselbe Bedeutung, aber der Rahmen kann sich ändern. Wenn Sie keine Rotationen ohne rechten Winkel ausführen, ist der Rahmen immer die transformierte Ansicht in Bezug auf die Koordinaten der Übersicht.
Das alles wird in einer nützlichen Minibibliothek hier genauer erklärt:
Die Eigenschaften center
, bounds
und frame
sind miteinander verknüpft: Wenn Sie eine Eigenschaft ändern, werden die anderen aktualisiert. Verwenden Sie sie also nach Belieben. Anstatt beispielsweise die x/y-Parameter von frame
zu ändern, um eine Ansicht erneut zu zentrieren, aktualisieren Sie einfach die Eigenschaft center
.