Wie bekomme ich LayoutSubviews, die vor sizeThatFits aufgerufen werden sollen?

8

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%     
Pwner 27.08.2012, 19:35
quelle

5 Antworten

6

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).

    
Johannes Fahrenkrug 11.12.2013 17:08
quelle
2

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.

%Vor%

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.

    
TomSwift 11.12.2013 17:19
quelle
1

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.

    
Patrick Goley 11.12.2013 16:57
quelle
1

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.

    
Martin 17.12.2013 00:52
quelle
0

Können Sie nicht einfach den Rahmen der Unteransicht in der -layoutSubviews -Methode anstelle der -sizeThatFits: -Methode ändern?

    
Wolfgang Schreurs 27.08.2012 19:40
quelle

Tags und Links