web-dev-qa-db-de.com

Rahmen, Grenzen, Mittelpunkt, Ursprung von UIView, wann soll was verwendet werden?

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?

194
Boon

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.

238
Barney Mattox

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:

http://bynomial.com/blog/?p=24

36
Tyler

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.

18
Marco Mustapic