UIViews Rahmen, Grenzen, Zentrum, Ursprung, wann was verwenden?

195

UIViewhat die Eigenschaften frame, bounds, center, und origin, und sie alle werden miteinander verknüpft zu sein scheinen. Die meiste Zeit beschäftige ich mich mit der frameEinstellung der Position und Größe von a UIView. Ich verstehe, dass framedas globale Koordinatensystem verwendet wird und boundsdie Koordinate der lokalen Ansicht verwendet wird (daher sind x und y 0, aber nicht immer), aber es ist mir immer noch verwirrend, wann ich was verwenden soll.

Unter welchem Kontext (und was ist der richtige Zeitpunkt) die anderen Eigenschaften ( bounds, center, origin) verwendet werden?

Segen
quelle
Der Link unten hat die beste Antwort. stackoverflow.com/questions/5361369/…
Ohmy
Frame vs Bounds mit Bildern: stackoverflow.com/a/28917673/3681880
Suragch

Antworten:

240

Marcos Antwort oben ist richtig, aber nur um die Frage "unter welchem ​​Kontext" zu erweitern ...

Rahmen - 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 die Datei frame.origin direkt der Stelle entspricht, an der das Steuerelement angezeigt werden muss, 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 Bewegung oder Skalierung auftreten können. Standardmäßig basieren Animation und Drehung auf der Mitte der UIView. Es ist selten sinnvoll, solche Objekte über die Frame-Eigenschaft zu verwalten.

Grenzen - Diese Eigenschaft ist keine Positionierungseigenschaft, sondern definiert den zeichnbaren Bereich der 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 hierzu finden Sie unter dem folgenden Link. Es ist ungewöhnlich, dass diese Eigenschaft manipuliert wird, es sei denn, der Zeichnungsbereich muss speziell angepasst werden. Die einzige Ausnahme besteht darin, dass die meisten Programme beim [[UIScreen mainScreen] bounds]Start den sichtbaren Bereich für die Anwendung bestimmen und den ursprünglichen UIView-Frame entsprechend einrichten.

Warum gibt es in einer UIView ein Rahmenrechteck und ein Begrenzungsrechteck?

Hoffentlich hilft dies dabei, die Umstände zu klären, unter denen jede Eigenschaft verwendet werden könnte.

Barney Mattox
quelle
33
Ich denke, es lohnt sich hinzuzufügen, dass die boundshäufig verwendet werden, wenn auf eine Ansicht eine Transformation angewendet wird. Unter diesen Umständen ist die frameEigenschaft nicht definiert. Wie in anderen Antworten hervorgehoben, entspricht das Ändern von centerund boundsdem Ändern der Position bzw. Größe der Ansicht.
Stuart
36

Sie sind verwandte Werte und werden durch die Eigenschafts-Setter / Getter-Methoden konsistent gehalten (und unter Verwendung der 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, sondern 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, haben Grenzen und Zentrum dieselbe Bedeutung, aber der Rahmen kann sich ändern. Sofern Sie keine nicht rechtwinkligen Rotationen ausführen, ist der Rahmen immer die transformierte Ansicht in Bezug auf die Koordinaten der Übersicht.

Dieses Zeug wird hier mit einer nützlichen Minibibliothek ausführlicher erklärt:

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

Tyler
quelle
18

Die Eigenschaften center, boundsund frameverriegelt sind: Änderung eines der andere aktualisieren, so dass sie so aber verwenden Sie wollen. Anstatt beispielsweise die x / y-Parameter von framezu ändern, um eine Ansicht neu zu zentrieren, aktualisieren Sie einfach die centerEigenschaft.

Marco Mustapic
quelle