Wenn ich in einer meiner Ansichten sizeToFit
aufruft, bemerkte ich, dass das iOS-Framework zuerst sizeThatFits
und dann layoutSubviews
für diese Ansicht aufruft. Das ist für mich problematisch, weil die Berechnung in meinem sizeThatFits
von den Ergebnissen meiner layoutSubviews
abhängt. Im folgenden Beispiel wird eine Unteransicht in layoutSubviews
angepasst, und die Höhe dieser Unteransicht wird in sizeThatFits
verwendet. Momentan funktioniert mein Code nicht, die Reihenfolge ist umgekehrt.
In meiner Ansicht Controller viewDidLoad:
%Vor%Aus meiner Sicht:
%Vor%Sie möchten, dass Ihre Ansicht immer das Richtige tut (tm), egal in welcher Reihenfolge Sie die Dinge nennen. Um dies zu erreichen, würde ich vorschlagen, Ihren Code so zu setzen, dass er die gewünschte Höhe für Ihre Ansicht und die Unteransichten in einer separaten Methode berechnet. Etwas in dieser Richtung:
%Vor% Auf diese Weise sind Sie nicht darauf angewiesen, eine bestimmte Methode aufzurufen, bevor Sie sizeToFit
aufrufen, aber Ihre Ansicht wird immer das tun, was Sie wollen. Außerdem ist Ihr Code weniger spröde und einfacher zu verstehen, wenn Sie ihn in ein paar Monaten betrachten (oder von einem anderen Entwickler untersucht).
Wenn Ihr sizeThatFits:
erfordert, dass das Layout korrekt ist, müssen Sie ein Layout erzwingen (siehe Code unten). Aber ich denke, das ist schlecht entworfen, weil Ihr Layout die "Größe" nicht berücksichtigt.
Ein besserer Ansatz könnte darin bestehen, das automatische Layout für Ihre Untersichten zu verwenden und dann systemLayoutSizeFittingSize:
zu verwenden, um die erforderliche Größe Ihrer Ansicht zu bestimmen (vs. sizeThatFits:
)
Wenn Sie das automatische Layout nicht verwenden können oder wollen, sollten Sie separate Codepfade für die tatsächliche Layout- und Layoutberechnung in Erwägung ziehen.
Haben Sie versucht, layoutIfNeeded
in der Ansicht aufzurufen, um layoutSubviews
zu erzwingen? Trotz des irreführenden Namens ist dies der Weg, um layoutSubviews
sofort auszulösen. Versuchen Sie, dies vor sizeToFit
oder sizeThatFits
aufzurufen.
Das Problem besteht darin, dass die Unteransichten keine Dimensionen haben, bis layoutSubviews aufgerufen wird. Dies ist das Gleiche wie in einer benutzerdefinierten Tabellenansichtszelle.
Um dies zu umgehen, müssen Sie entweder die Logik ändern oder die Mathematik selbst machen, um eine explizite Dimension zu erhalten, ohne auf automatische Dinge angewiesen zu sein.
Können Sie nicht einfach den Rahmen der Unteransicht in der -layoutSubviews
-Methode anstelle der -sizeThatFits:
-Methode ändern?
Tags und Links iphone ios cocoa-touch uiview