Zunächst sollte ich erwähnen, das ist vor allem ein Effizienzproblem.Frame-Berechnungen in `viewDidLayoutSubviews`
Es gibt viele Diskussionen, wo Frame-Berechnungen zu tun sind, wo viewWillAppear
zu früh ist und viewDidAppear
zu spät ist (Sicht ist bereits sichtbar).
Die allgemeine Antwort ist, Frame-Berechnungen in viewDidLayoutSubviews
zu tun. Problem ist, dass es mehrmals aufgerufen wird. Schlimmer noch, der genaueste Anruf, bei dem alle Frames ihre endgültige Größe haben, ist der letzte. Nach meinem Wissen gibt es keine Möglichkeit zu wissen, welcher Anruf der letzte ist.
Wir verwenden eine ‚framesAreSet‘ Flag haben (initialisiert false) und eine Überprüfung, wo, wenn Rahmen nicht Null ist (wie self.view.frame.size.width != 0
etwas) und ‚framesAreSet‘ falsch ist, es geht in die Fahne ab und berechnen nur einmal . Etwas wie:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if (self.view.frame.size.width != 0 && !framesAreSet)
{
framesAreSet = true;
//Calculate frames here
}
}
Das sieht in Ordnung, aber in Wahrheit, eine Prüfung für so etwas wie self.view.frame.size.width != 0
tut nicht Garantie, dass Frames ist in der Tat ein. Die Tatsache, dass viewDidLayoutSubviews
danach aufgerufen wird, legt nahe, dass einige Frames nicht auf ihren Endstatus gesetzt wurden.
Wäre toll, eine viewCompleteLayoutSubviews
zu haben. Irgendwelche Ideen darüber, was der beste Weg ist, um eine 'einmalige' Rahmenberechnung durchzuführen, wenn alle Rahmen gesetzt und angezeigt werden, ist noch nicht sichtbar?
(Dies ist wahrscheinlich ein Problem mit Blick nicht mit NSConstraints)
Warum ist es ein Problem, dass 'viewDidLayoutSubviews' mehr als einmal aufgerufen wird? Welches Problem haben Sie? – rmaddy
Werden Sie zufällig die Grenzen von 'self.view' darin aktualisieren? Wenn das so ist, ist das dein Problem. – Clafou
@rmaddy Redundanz ist keine gute Kodierungspraxis. Angenommen, Sie haben einen komplexen ViewController, fügen viele Subviews im Code hinzu (die in der Tat größtenteils im Code erstellt wurden) und führen viele Berechnungen für Einstellungsrahmen durch. Stellen Sie sich vor, Sie hätten "schwere" Berechnungen so oft, wie Sie Subviews plus hinzufügen. Wohlgemerkt, alle außer dem letzten sind überflüssig. Manchmal ist es nicht gut genug. – bauerMusic