Ich habe eine Ansicht, die Zeilen und Spalten von Bildansichten enthält.
Wenn die Größe dieser Ansicht geändert wird, muss ich die Positionen der Bildansichten neu anordnen.
Diese Ansicht ist eine Unteransicht einer anderen Ansicht, deren Größe geändert wird.
Gibt es eine Möglichkeit zu erkennen, wann die Größe dieser Ansicht geändert wird?
Antworten:
Wie Uli weiter unten kommentiert hat, besteht die richtige Vorgehensweise darin,
layoutSubviews
die imageViews dort zu überschreiben und zu gestalten.Wenn Sie aus irgendeinem Grund nicht unterklassifizieren und überschreiben können
layoutSubviews
,bounds
sollte das Beobachten funktionieren, auch wenn es etwas schmutzig ist. Schlimmer noch, es besteht ein Risiko beim Beobachten - Apple garantiert nicht, dass KVO in UIKit-Klassen funktioniert. Lesen Sie hier die Diskussion mit dem Apple-Ingenieur: Wann wird ein zugeordnetes Objekt freigegeben?ursprüngliche Antwort:
Sie können die Schlüsselwertbeobachtung verwenden:
und implementieren:
quelle
viewWillTransition
usw. usw. verwendenlayoutSubviews
immer noch eine empfohlene Methode, wenn abhängig von der aktuellen Größe der Ansicht unterschiedliche Unteransichten hinzugefügt / entfernt und unterschiedliche Einschränkungen hinzugefügt / entfernt werden müssen?In einer
UIView
Unterklasse können Eigenschaftsbeobachter verwendet werden:Ohne Unterklassifizierung reicht die Schlüsselwertbeobachtung mit intelligenten Schlüsselpfaden aus :
quelle
frame
ist eine abgeleitete und zur Laufzeit berechnete Eigenschaft. Überschreiben Sie dies nicht, es sei denn, Sie haben einen sehr klugen und wissenden Grund dafür. sonst: benutzebounds
oder (noch besser)layoutSubviews
.override var bounds: CGRect { didSet { layer.cornerRadius = bounds.size.width / 2 }}
bounds
oderframe
Ändern funktioniert nicht garantiert, je nachdem, wo Sie Ihre Ansicht in die Ansichtshierarchie einfügen. Ich würdelayoutSubviews
stattdessen überschreiben . Sehen Sie diese und diese Antworten.Erstellen Sie eine Unterklasse von UIView und überschreiben Sie layoutSubviews
quelle
Swift 4 Keypath KVO - Auf diese Weise erkenne ich die Autorotation und bewege mich zum iPad-Seitenbereich. Sollte funktionieren funktioniert jede Ansicht. Musste die Schicht des UIView beobachten.
quelle
.layer
hat den Trick gemacht! Wissen Sie, warum die Verwendungview.observe
nicht funktioniert?Sie können eine Unterklasse von UIView erstellen und die überschreiben
setFrame: (CGRect) Frame
Methode. Dies ist die Methode, die aufgerufen wird, wenn der Rahmen (dh die Größe) der Ansicht geändert wird. Mach so etwas:
quelle
setFrame:
wurde meineUITextView
Unterklasse während der durch Autorotation verursachten Größenänderung nicht aufgerufenlayoutSubviews:
. Hinweis: Ich verwende das automatische Layout und iOS 7.0.setFrame:
.frame
ist eine abgeleitete Eigenschaft. Siehe meine AntwortZiemlich alt, aber immer noch eine gute Frage. Im Beispielcode von Apple und in einigen privaten UIView-Unterklassen überschreiben sie setBounds ungefähr wie folgt:
Überschreiben
setFrame:
ist keine gute Idee.frame
abgeleitet voncenter
,bounds
undtransform
, so iOS rufen nicht unbedingt werdensetFrame:
.quelle
setBounds:
jedoch auch beim Festlegen der Frame-Eigenschaft nicht aufgerufen (zumindest unter iOS 7.1). Dies könnte eine Optimierung sein, die Apple hinzugefügt hat, um die zusätzliche Meldung zu vermeiden.frame
undbounds
von der zugrunde liegenden Ansicht abgeleitetCALayer
; Sie rufen einfach den Getter der Schicht an. UndsetFrame:
setzt den Rahmen der Ebene, währendsetBounds:
Sätze die Schichtgrenzen. Sie können also nicht einfach den einen oder anderen überschreiben. WirdlayoutSubviews
auch übermäßig aufgerufen (nicht nur bei Geometrieänderungen), sodass dies möglicherweise auch nicht immer eine gute Option ist. Immer noch auf der Suche ...Wenn Sie sich in einer UIViewController-Instanz befinden,
viewDidLayoutSubviews
reicht das Überschreiben aus .quelle
UIView
Instanzen undUIViewController
Instanzen bemerkt . Wenn Sie also eineUIView
Instanz ohne VC haben, sind die anderen Antworten großartig. Wenn Sie jedoch zufällig an eine VC angehängt sind, ist dies Ihr Mann. Entschuldigung, es gilt nicht für Ihren Fall.