Ich bin Kyoya, Praktikantin bei einer selbst entwickelten Venture-Firma. Da meine Kenntnisse über den Layoutzyklus von ViewController und UIView in mir durcheinander geraten sind, habe ich beschlossen, ihn in mir selbst zu organisieren und mit der Bedeutung der Erklärung für Anfänger zusammenzufassen.
Überraschenderweise denken viele Leute, dass ViewController und View verwirrt sind. Lassen Sie uns sie also einmal hier organisieren.
Dieser Ansichts-Controller, der beim Starten eines Projekts mit Xcode generiert wird, ähnelt Ihnen als Anfänger. Es ist in Ordnung, wenn Sie der Meinung sind, dass dieser Ansichts-Controller die Anzeige der Ansicht auf sehr einfache Weise verwaltet. Eine Ansicht ist einer Ansichtssteuerung zugeordnet. Platzieren Sie beim Erstellen eines Bildschirms Schaltflächen und Beschriftungen in dieser verknüpften UIView. (Wenn sich zwei Ansichten überschneiden, wird die Ansicht in der unteren Hierarchie als übergeordnete Ansicht (Superansicht) und die Ansicht in der oberen Hierarchie als untergeordnete Ansicht (Unteransicht) bezeichnet.)
Ich werde den Lebenszyklus erläutern, der auch Gegenstand dieses Artikels ist. Der Lebenszyklus ist eine Sammlung von Prozessen zum Anzeigen des Bildschirms. Beispielsweise verschiedene Prozesse wie das Einlesen des Ansichtscontrollers in den Speicher, das Berechnen der Positionsinformationen der anzuzeigenden Ansicht und das tatsächliche Anzeigen der Ansicht auf dem Bildschirm. Läuft. Und wie gesagt, es gibt zwei Arten der Verarbeitung im Lebenszyklus: die Verarbeitung auf der Seite des Ansichtscontrollers und die Verarbeitung auf der Seite der Ansicht. Es gibt einen Zeitpunkt für die Anzeige der Ansicht im ViewController, aber es ist in Ordnung zu verstehen, dass die Verarbeitung auf der Ansichtsseite dort erfolgt.
Ich werde die Verarbeitung des Lebenszyklus des View Controllers erklären. Abschließend wird der Vorgang wie im Bild unten fortgesetzt.
Wenn Sie sagen, dass Sie zu diesem Artikel gekommen sind, haben Sie wahrscheinlich schon oft solche Bilder gesehen. Und jedes Mal denken manche Menschen, dass sie sich nicht erinnern oder verstehen können. Es ist in Ordnung. Ich werde es auf leicht verständliche Weise erklären.
Zunächst kann der Lebenszyklus des View Controllers grob in die folgenden drei Stufen unterteilt werden. (ViewWillDissappear und viewDidDisappear zum Zeitpunkt des View-Übergangs werden weggelassen.) Laden Sie ViewController → View View, über die ViewController verfügt → Nach Abschluss der Anzeige Schauen wir uns jeden an
Registrieren Sie zunächst den Ansichtscontroller, der dem im Speicher anzuzeigenden Bildschirm entspricht (wie ein Datenbereich). Selbst wenn Sie nach der Registrierung einen Bildschirmübergang durchführen, wird dieser nicht aus dem Speicher entfernt, sodass er nur bei der ersten Anzeige aufgerufen wird. Die folgenden zwei Methoden werden hier aufgerufen.
loadView()
viewDidLoad()
viewWillAppear()
loadView ()
ist der Vorgang des tatsächlichen Registrierens des View-Controllers im Speicher.
viewDidLoad ()
ist ein Prozess, der nach der Registrierung im Speicher aufgerufen wird. LoadView ()
hat das Laden des View-Controllers beendet, und das Laden der gehaltenen Ansicht ist ebenfalls loadView () ` Da es mit
endet, können Sie in viewDidLoad ()
Eigenschaften für jede Ansicht (Hintergrundfarbeneinstellung, Beschriftungstexteinstellung usw.) wie unten gezeigt festlegen.
override func viewDidLoad() {
super.viewDidLoad()
testView.backgroundColor = .red
}
viewWillAppear ()
wird aufgerufen, bevor das Bild angezeigt wird. Dies wird auch beim Wechseln der TabBars aufgerufen, da es jedes Mal aufgerufen wird, wenn der Bildschirm angezeigt wird. Im Gegensatz zu viewDidLoad ()
wird es dadurch gekennzeichnet, dass es viele Male aufgerufen wird.
Nachdem Sie in den Speicher gelesen und die Eigenschaften für jede Ansicht festgelegt haben, wird die Ansicht als Nächstes angezeigt. Die folgenden zwei Methoden werden hier aufgerufen.
viewWillLayoutSubViews()
viewDidLayoutSubViews()
viewWillLayoutSubVIews ()
wird vor dem Start des View-Layouts aufgerufen. Es wird auch aufgerufen, wenn der Bildschirm gedreht wird, wenn die Größe der Ansicht geändert wird oder wenn die Ansicht gelöscht oder hinzugefügt wird. Danach geben wir das Layout der Ansicht ein (später beschrieben).
viewDidLayoutSubViews ()
wird aufgerufen, nachdem das View-Layout fertig ist. Hier ist also das Layout der Ansicht fertig und die Position und Größe der Ansicht werden festgelegt.
Die folgende Methode wird hier aufgerufen.
viewDidAppear()
viewDidAppear ()
wird aufgerufen, nachdem die Bildschirmanzeige beendet ist. Der Prozess, den Sie hier hinzufügen, ist für die Benutzererfahrung grundsätzlich irrelevant. Zum Beispiel das Anzeigen von Protokollen. Da diese Methode mit "viewWillAppear ()" gekoppelt ist, wird sie auch jedes Mal aufgerufen, wenn der Bildschirm angezeigt wird.
Dies ist die Erklärung des Lebenszyklus des View Controllers.
Von hier aus fahren wir mit dem View-Lebenszyklus fort. Dieser Prozess wird nach dem vorherigen viewWillLayoutSubViews ()
aufgerufen.
Der View-Lebenszyklus wird durch den folgenden Vorgang angezeigt.
Einschränkungsaktualisierung → Aktualisierung der Rahmeninformationen → Rendern (Zeichenprozess)
Schauen wir uns jeden an
Der Einschränkungsaktualisierungsprozess wird ausgeführt, wenn die Einschränkung geändert wird. Der Prozess, der die Einschränkungsänderung verursacht, ist wie folgt.
Wenn Sie also "NSLayoutConstraints.activate ([~~~])" ausführen, wird updateConstrains () aufgerufen.
Wenn der Einschränkungsaktualisierungsprozess ausgeführt wird, wird das updateConstraints ()
der Ansicht aufgerufen, das die Einschränkung enthält. Bitte seien Sie hier vorsichtig. Sie könnten denken, dass "updateConstraints ()" mit der View-Controller-Methode gemischt ist, aber da der View-Controller selbst nicht eingeschränkt werden kann, ist diese Methode eine Methode, über die die View verfügt. (Was View hat, bedeutet, dass es auch UIButton und UILabel hat, die von der UIView-Klasse erben).
Es ist auch möglich, den Einschränkungsaktualisierungsprozess jederzeit aufzurufen. Sie können "updateConstraints ()" einer Ansicht aufrufen, für die Einschränkungsaktualisierungen erforderlich sind, indem Sie "updateConstraintsIfNeeded ()" aufrufen. Sie können die Ansicht auch als "Einschränkungsaktualisierung erforderlich" kennzeichnen, indem Sie "setNeedsUpdateCOnstrains ()" aufrufen.
Es ist kompliziert, aber da "updateConstrainsIfNeeded ()" die Verarbeitung von Einschränkungsaktualisierungen auf seine eigene Ansicht und ihre Unteransicht anwendet, selbst wenn Sie "updateConstrainsIfNeeded ()" für eine bestimmte Ansicht ausführen, die der übergeordneten Ansicht Selbst wenn das Einschränkungsaktualisierungsflag in Ansicht gesetzt ist, wird keine Verarbeitung durchgeführt.
Zusammenfassend ist es etwas kompliziert. Wenn Sie "updateConstrainsIfNeeded ()" aufrufen, wird "updateConstrains ()" der Ansicht aufgerufen, die "setNeedsUpdateConstrains ()" in ihrer eigenen Ansicht und ihrer Unteransicht aufgerufen hat. ..
Darüber hinaus können Sie auch die Einschränkung aktualisieren, dass "setNeedsUpdateConstrains ()" zum Zeitpunkt der nächsten Einschränkungsaktualisierung aufgerufen wurde (das Timing bleibt dem System überlassen, dies wird jedoch empfohlen * der Grund wird später beschrieben).
Ich hoffe, Sie können sich Frame-Informationen als Informationen wie Position und Größe der Ansicht vorstellen. Dieser Prozess wird aufgerufen, wenn die Rahmeninformationen aktualisiert werden. Die auszulösenden Auslöser sind wie folgt.
-Ändern Sie den Rahmen der Ansicht -Wenn eine Ansicht hinzugefügt oder gelöscht wird
contentOffSet
der ContentView
der UIScrollView
geändert wird (einfach wenn die Koordinaten der Elemente in der ScrollView geändert werden, ist die Anzeigeposition der Benutzer Es gibt Zeiten, in denen Sie vereinheitlichen und in der Mitte der Schriftrolle anzeigen möchten, anstatt sie entscheiden zu lassen, und sie in solchen Fällen verwenden möchten.)Die hier aufgerufene Methode ist layoutSubViews ()
. Diese Methode verwendet die Einschränkungsinformationen, um die Rahmeninformationen zu erstellen. Sie können "layoutSubViews ()" jederzeit aufrufen, genau wie beim Aktualisieren von Einschränkungen. Das Aufrufen von layoutIfNeeded ()
wird als "Rahmeninformationen müssen aktualisiert werden" gekennzeichnet (kann durch Aufrufen von setNeedsLayoutSubViews ()
) von Selbst- und untergeordneten Ansichten gekennzeichnet werden Sie können layoutSubViews ()
ausführen. Außerdem werden mit "setNeedsLayoutSubViews ()" gekennzeichnete Ansichten zum Zeitpunkt der nächsten Frame-Aktualisierung sofort aktualisiert (das Timing bleibt dem System überlassen, dies wird jedoch empfohlen * der Grund wird später beschrieben). Die Denkweise hier ist eingeschränkt Es ähnelt dem Update von, daher werde ich es nicht im Detail erklären.
Ich habe bereits erwähnt, dass layoutSubViews (), das zum System-Timing ausgeführt wurde, besser ist, aber ich werde erklären, warum.
Gleiches gilt für updateConstraints () zum Aktualisieren von Einschränkungen.
Bitte beachten Sie, dass die Verarbeitung von "layoutSubViews ()", die von "layoutSubViewsIfNeeded ()" aufgerufen wird, im Hauptthread ausgeführt wird. Anfängern ist es vielleicht nicht vertraut, aber verstehen Sie, dass der Haupt-Thread dem Bereich entspricht, in dem die Verarbeitung stattfindet. In diesem Hauptthread werden auch hier Änderungen an der Benutzeroberfläche vorgenommen. Wenn Sie den Hauptthread mit "layoutSubViewsIfNeeded ()" verwenden, wird das UI-Update daher während dieser Zeit gestoppt, was sich auf die Benutzererfahrung auswirken kann. Im Falle einer Verarbeitung, die mit der Benutzeroberfläche in Zusammenhang zu stehen scheint, rufen wir layoutSubViews ()
direkt überschreiben auf. LayoutSubVIews ()
, das zum regulären Zeitpunkt aufgerufen wird, kann ausgeführt werden, ohne den Hauptthread zu belegen, sodass Änderungen an der Benutzeroberfläche nicht betroffen sind.
Beim Überschreiben sind zwei Punkte zu beachten. Der erste Punkt ist, dass Sie zuerst "super.layoutSubViews ()" ausführen müssen. Der Frame wird mit super.layoutSubViews ()
aktualisiert. Wenn Sie dies nicht zuerst tun, müssen Sie Ihre eigene Verarbeitung schreiben, ohne den Frame zu aktualisieren. Dies kann eine Brutstätte für Fehler sein. Der zweite Punkt ist, dass die Rahmeninformationen aus der übergeordneten Ansicht von oben nach unten aktualisiert werden. Da das Update von oben nach unten erfolgt, kann ich das Layout der untergeordneten Ansicht ändern. Wenn ich jedoch eine Änderung an der übergeordneten Ansicht vornehme, wird "layoutSubViews ()" erneut aufgerufen und stürzt ab.
Hier wird die Ansicht mithilfe der aktualisierten Rahmeninformationen tatsächlich auf dem Bildschirm gezeichnet. Dieser Vorgang wird zum folgenden Zeitpunkt aufgerufen.
Die hier aufgerufene Methode ist drawRext (_ :)
. Wenn Sie dies jederzeit aufrufen möchten, können Sie es explizit aufrufen, indem Sie es mit "setNeededDisplay ()" oder "setNeedsDisplayInRect ()" markieren.
Das ist alles für diesen Artikel. Es ist voluminöser geworden, als ich es mir vorgestellt habe, aber bitte beziehen Sie sich darauf. Ich werde einen Artikel schreiben, wenn es neue Entdeckungen gibt.
Vielen Dank.
Recommended Posts