Ich würde gerne wissen, wie man diese Eigenschaften richtig einsetzt.
Soweit ich weiß, frame
kann aus dem Container der Ansicht verwendet werden, die ich erstelle. Hiermit wird die Ansichtsposition relativ zur Containeransicht festgelegt. Außerdem wird die Größe dieser Ansicht festgelegt.
Auch center
kann aus dem Behälter der Ansicht verwendet werden , ich bin zu schaffen. Diese Eigenschaft ändert die Position der Ansicht relativ zu ihrem Container.
Schließlich bounds
ist relativ zur Ansicht selbst. Es ändert den Zeichenbereich für die Ansicht.
Können Sie weitere Informationen über die Beziehung zwischen frame
und geben bounds
? Was ist mit den clipsToBounds
und masksToBounds
Eigenschaften?
Antworten:
Da die von mir gestellte Frage schon oft gesehen wurde, werde ich eine detaillierte Antwort darauf geben. Sie können es jederzeit ändern, wenn Sie korrekteren Inhalt hinzufügen möchten.
Zunächst eine Zusammenfassung der Frage: Rahmen, Grenzen und Zentrum und ihre Beziehungen.
Rahmen Die Ansicht
frame
(CGRect
) einer Ansicht ist die Position ihres Rechtecks imsuperview
Koordinatensystem des Ansichts . Standardmäßig beginnt es oben links.Grenzen Eine Ansicht
bounds
(CGRect
) drückt ein Ansichtsrechteck in einem eigenen Koordinatensystem aus.Mittelpunkt A
center
wirdCGPoint
in Form dessuperview
Koordinatensystems ausgedrückt und bestimmt die Position des exakten Mittelpunkts der Ansicht.Aus UIView + -Position entnommen sind dies die Beziehungen (sie funktionieren nicht im Code, da es sich um informelle Gleichungen handelt) zwischen den vorherigen Eigenschaften:
frame.origin = center - (bounds.size / 2.0)
center = frame.origin + (bounds.size / 2.0)
frame.size = bounds.size
HINWEIS: Diese Beziehungen gelten nicht, wenn Ansichten gedreht werden. Für weitere Informationen schlage ich vor, dass Sie sich das folgende Bild aus The Kitchen Drawer ansehen, das auf dem Stanford CS193p- Kurs basiert . Credits gehen an @Rhubarb .
Mit der
frame
Option können Sie eine Ansicht innerhalb der Ansicht neu positionieren und / oder deren Größe ändernsuperview
. Kann normalerweise von a verwendet werdensuperview
, wenn Sie beispielsweise eine bestimmte Unteransicht erstellen. Zum Beispiel:Wenn Sie die Koordinaten zum Zeichnen in einem benötigen,
view
beziehen Sie sich normalerweise aufbounds
. Ein typisches Beispiel könnte sein, inview
einer Unteransicht als Einschub der ersten zu zeichnen . Das Zeichnen der Unteransicht erfordert die Kenntnisbounds
der Übersicht. Zum Beispiel:Unterschiedliche Verhaltensweisen treten auf, wenn Sie die
bounds
Ansicht ändern . Wenn Sie beispielsweise das ändernbounds
size
, ändern sich dieframe
Änderungen (und umgekehrt). Die Änderung erfolgt umcenter
die Ansicht herum . Verwenden Sie den folgenden Code und sehen Sie, was passiert:Wenn Sie sich ändern, ändern
bounds
origin
Sie außerdem dasorigin
interne Koordinatensystem. Standardmäßigorigin
ist das bei(0.0, 0.0)
(obere linke Ecke). Wenn Sie beispielsweise dasorigin
für ändernview1
, können Sie sehen (kommentieren Sie den vorherigen Code, wenn Sie möchten), dass jetzt die obere linke Ecke fürview2
denview1
einen berührt . Die Motivation ist ganz einfach. Sie sagen,view1
dass sich die obere linke Ecke jetzt an der Position befindet,(20.0, 20.0)
aber daview2
die vonframe
origin
beginnt(20.0, 20.0)
, werden sie zusammenfallen.Das
origin
repräsentiert dieview
Position des 's innerhalb seinersuperview
, beschreibt aber die Position desbounds
Zentrums.Schließlich
bounds
undorigin
sind keine verwandten Konzepte. Beide erlauben es, dasframe
einer Ansicht abzuleiten (siehe vorherige Gleichungen).Die Fallstudie von View1
Folgendes passiert, wenn das folgende Snippet verwendet wird.
Das relative Bild.
Dies passiert stattdessen, wenn ich die
[self view]
Grenzen wie folgt ändere .Das relative Bild.
Hier sagst du,
[self view]
dass sich seine obere linke Ecke jetzt an der Position (30.0, 20.0) befindet, aber daview1
der Frame-Ursprung von (30.0, 20.0) beginnt, fallen sie zusammen.Zusätzliche Referenzen (zum Aktualisieren mit anderen Referenzen, wenn Sie möchten)
Über
clipsToBounds
(Quelle Apple Doc)Mit anderen Worten, wenn eine Ansicht
frame
ist(0, 0, 100, 100)
und ihre Unteransicht ist(90, 90, 30, 30)
, sehen Sie nur einen Teil dieser Unteransicht. Letzteres überschreitet nicht die Grenzen der übergeordneten Ansicht.masksToBounds
ist äquivalent zuclipsToBounds
. Anstelle von aUIView
wird diese Eigenschaft auf a angewendetCALayer
. Unter der HaubeclipsToBounds
ruftmasksToBounds
. Weitere Referenzen finden Sie unter Wie ist die Beziehung zwischen den ClipsToBounds von UIView und den MaskenToBounds von CALayer? .quelle
Diese Frage hat bereits eine gute Antwort, aber ich möchte sie mit einigen weiteren Bildern ergänzen. Meine vollständige Antwort ist hier.
Um mich an den Rahmen zu erinnern , denke ich an einen Bilderrahmen an einer Wand . So wie ein Bild an eine beliebige Stelle an der Wand verschoben werden kann, ist das Koordinatensystem des Rahmens einer Ansicht die Übersicht. (Wand = Übersicht, Rahmen = Ansicht)
Um mich an Grenzen zu erinnern , denke ich an die Grenzen eines Basketballplatzes . Der Basketball befindet sich irgendwo auf dem Platz, genau wie das Koordinatensystem der Sichtgrenzen innerhalb der Sicht selbst liegt. (Platz = Ansicht, Basketball / Spieler = Inhalt innerhalb der Ansicht)
Wie der Frame befindet sich auch view.center in den Koordinaten der Übersicht.
Frame vs Bounds - Beispiel 1
Das gelbe Rechteck repräsentiert den Rahmen der Ansicht. Das grüne Rechteck repräsentiert die Grenzen der Ansicht. Der rote Punkt in beiden Bildern repräsentiert den Ursprung des Rahmens oder der Grenzen innerhalb ihrer Koordinatensysteme.
Beispiel 2
Beispiel 3
Beispiel 4
Dies ist dasselbe wie in Beispiel 2, außer dass diesmal der gesamte Inhalt der Ansicht so angezeigt wird, als würde er nicht an die Grenzen der Ansicht gekürzt.
Beispiel 5
Auch hier finden Sie meine Antwort mit weiteren Details.
quelle
Ich fand dieses Bild am hilfreichsten, um Rahmen, Grenzen usw. zu verstehen.
Bitte beachten Sie auch, dass
frame.size != bounds.size
das Bild gedreht wird.quelle
Ich denke, wenn Sie es von dem Punkt aus denken
CALayer
, ist alles klarer.Frame ist überhaupt keine eigenständige Eigenschaft der Ansicht oder Ebene, sondern eine virtuelle Eigenschaft, die aus den Grenzen, der Position (
UIView
Mitte) und der Transformation berechnet wird .Grundsätzlich wird also festgelegt, wie die Layer- / Ansichtslayouts wirklich von diesen drei Eigenschaften (und anchorPoint) bestimmt werden, und jede dieser drei Eigenschaften ändert keine andere Eigenschaft, wie das Ändern der Transformation die Grenzen nicht ändert.
quelle
Es gibt sehr gute Antworten mit detaillierten Erklärungen zu diesem Beitrag. Ich möchte nur darauf hinweisen, dass es eine weitere Erklärung mit visueller Darstellung für die Bedeutung von Frame, Bounds, Center, Transform, Bounds Origin im WWDC 2011-Video gibt. Grundlegendes zum UIKit-Rendering von @ 4: 22 bis 20:10
quelle
Nachdem ich die obigen Antworten gelesen habe, füge ich hier meine Interpretationen hinzu.
Angenommen, Sie surfen online. Der Webbrowser
frame
entscheidet, wo und wie groß die Webseite angezeigt werden soll . Der Browser des Browsersbounds.origin
entscheidet, welcher Teil der Webseite angezeigt wird.bounds.origin
ist schwer zu verstehen. Der beste Weg, dies zu lernen, besteht darin, eine Einzelansichtsanwendung zu erstellen, diese Parameter zu ändern und zu sehen, wie sich Unteransichten ändern.quelle