2015-01-22 8 views
5

Eine Anzahl von S.O. Fragen zeigen eine automatische Layout-Technik die Mindestgröße von einer Ansicht erforderlich, um zu bestimmen erfordert seine Einschränkungen zu erfüllen: [header systemLayoutSizeFittingSize: UILayoutFittingCompressedSize]Führt SystemLayoutSizeFittingSize aus: erfordern setNeedsLayout & layoutIfNeeded davor?

Bevor die systemLayoutSizeFittingSize: Aufruf, alle Beispiele, die ich ein Layout-Update zwingen gesehen haben, wie folgt aus:

[view setNeedsLayout]; 
[view layoutIfNeeded]; 
CGFloat height = [view systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height; 

Ich würde gerne wissen, wann dies wirklich notwendig ist, da es als rituelle Würze eingestreut scheint: Ich würde gerne verstehen, warum ich telefoniere, anstatt es für Glück zu tun!

Ich habe gerade systemLayoutSizeFittingSize: in einem Code verwendet, wo ich selektiv eine Ansicht aktualisieren, die UITableView Instanz ist tableViewHeader (nicht Abschnitt Header), dann ändern Sie die Größe. Es scheint ohne die zusätzlichen Anrufe gut zu funktionieren. Ich habe dies in meinem viewDidLoad:

{ 
    // Remove the view that we don't want. 
    [self.autoPopulateView removeFromSuperview]; 

    // Resize the table's header view now the unwanted view is removed. 
    UIView *const header = self.tableView.tableHeaderView; 

    // Don't explicitly layout. 
    // [header setNeedsLayout]; 
    // [header layoutIfNeeded]; 

    CGFloat height = [header systemLayoutSizeFittingSize: UILayoutFittingCompressedSize].height; 
    CGRect frame = header.frame; 
    frame.size.height = height; 
    header.frame = frame; 
} 

Dank.

+0

Ich untersuche die gleiche Sache, jemals einen Abschluss erreicht? Vielen Dank! – mikywan

+0

:-) Nein! Ich bin mir ziemlich sicher, dass ich etwas Ähnliches gelesen habe, aber ich kann es jetzt nicht finden. Ich dachte darüber nach, ein Kopfgeld darauf zu legen, aber ich bin mir nicht sicher, ob ich mich so sehr darum kümmere. Es tut uns leid. – Benjohn

Antwort

0

Es sollte definitiv keine dieser Aufrufe vor dem Aufruf von systemLayoutSizeFittingSize erforderlich sein. Solange alle Ihre Beschränkungen vorhanden sind, sollten Sie nichts anderes tun müssen.

In der Tat ist das Erzwingen eines Layout-Durchlaufs im Voraus potenziell vom Standpunkt der Leistung nachteilig, und ich würde argumentieren, dass dies nicht nur unnötig, sondern sogar schädlich ist.

0

es scheint definitiv wie layoutIfNeeded ist eine allumfassende Antwort auf Inkonsistenzen von Höhenberechnungen zu sehen, wenn systemLayoutSizeFittingSize mit - das Problem ist, dass der Wert zum Debuggen sehr schwierig ist, wenn es falsch ist

Nach meiner Erfahrung müssen Sie rufen layoutIfNeeded Immer wenn Ihre Zielansicht die Einschränkungen im Code aktualisiert hat, z. B. Ändern einer Konstante, Hinzufügen, Entfernen einer Einschränkung. Aufruf setNeedsLayout oder setNeedsUpdateConstraints funktioniert nicht (Achselzucken)

Verwandte Themen