2014-09-26 13 views
15

So kann ich dynamische Größenanpassung mit automatischem Layout einrichten, wenn ich nur ein Label habe, das die Höhe basierend auf der Länge ändert die Saite. Mein Problem ist, dass, wenn ich ein anderes UILabel hinzufüge, das das gleiche tun sollte, die Dinge nicht funktionieren.iOS 7/8 UITableView Zelle: Zwei UILabels mit dynamischer Höhe mit automatischem Layout für variable Zeilenhöhe

Ich gründe sowohl den Inhalt Hugging Priorität und der Kompressionswiderstand für beide bis 1000 == ich Warnungen der Mehrdeutigkeit

Wenn ich den Inhalt Hugging (vertikal) für den zweiten UILabel bis 999 oder 250 dann eingestellt funktioniert super aber nur wenn das zweite Label 2 oder mehr Zeilen hat. Wenn das zweite Label leer ist oder nur eine Zeile hat, gibt die heightForRowAtIndexPath systemLayoutSizeFittingSize: UILayoutFittingCompressedSize -Höhe große Werte zurück, und die Zellen haben große Leerzeichen.

Ich spielte auch mit der Eigenen Größe: Standard oder Platzhalter (mit ein paar Höhen und Breiten), aber es hilft auch nicht.

Wer irgendwelche Vorschläge, was getan werden kann?

Antwort

18

Ich habe es endlich funktioniert. Die Lösung bestand darin, die bevorzugte Breite explizit auf die aktuelle Rahmenbreite zu setzen. Aktivieren Sie das Kontrollkästchen "Explizit" im Feld "Label> Bevorzugte Breite" im Informationsfenster "Größe".

ref: http://www.raywenderlich.com/73602/dynamic-table-view-cell-height-auto-layout herunterladen Sie den Beispielcode und sehen Sie die Storyboard-Setup.

+0

Also war dein UILabel von einer festen Breite? –

+0

Nein, ich unterstütze verschiedene Gerätegrößen, daher variiert die Breite davon. – Zsolt

+2

Für mich bestand das fehlende Element darin, die Widerstandskritierung für Content Hugging und Inhaltskomprimierung für die Titel- und Untertitelbeschriftungen meiner Zelle festzulegen, wie im Ray Wenderlich-Tutorial gezeigt. – Daniel

0

Für mich Inhalt Inhalt umarmen Prioritäts-und Inhaltskompression Widerstand Priorität niedriger zu einem der Element funktionierte genau so, wie erwartet.

1

Für mich brauchte es eine Kombination aus mehreren Dingen.

  • Neben Einstellen der Inhalte umarmen und Widerstand korrekt
  • Ich hatte eine Unterklasse von UILabel zu machen, die preferredMaxLayoutWidth des Etiketts
  • und korrigieren Fehler in der intrinsicContentSize zu handhaben als auch

Die UILabel-Unterklasse endete folgendermaßen:

@implementation LabelDynamicHeight 

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    self.preferredMaxLayoutWidth = self.frame.size.width; 

    [super layoutSubviews]; 
} 

- (void)setBounds:(CGRect)bounds 
{ 
    [super setBounds:bounds]; 

    if (self.numberOfLines == 0) 
    { 
     CGFloat boundsWidth = CGRectGetWidth(bounds); 
     if (self.preferredMaxLayoutWidth != boundsWidth) 
     { 
      self.preferredMaxLayoutWidth = boundsWidth; 
      [self setNeedsUpdateConstraints]; 
     } 
    } 
} 

- (CGSize)intrinsicContentSize 
{ 
    CGSize size = [super intrinsicContentSize]; 

    if (self.numberOfLines == 0) 
    { 
     // There's a bug where intrinsic content size may be 1 point too short 
     size.height += 1; 
    } 

    return size; 
} 

@end 

Neben s Diese Aufruf von layoutIfNeeded für die Zelle vor dem Abrufen der Höhe in tableView heightForRowAtIndexPath: machte die Einschränkungen bereit vor der Verwendung der systemLayoutSizeFittingSize: Methode für die ContentView. Suchen Sie wie folgt aus:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = ...; 
    CGFloat height = cell.frame.size.height; 
    if (cell.dynamicHeight) 
    { 
     // https://stackoverflow.com/a/26351692/1840269 
     [cell layoutIfNeeded]; 
     height = cell.frame.size.height; 

     CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 
     if (size.height > height) 
      height = size.height; 
    } 
    return height; 
} 

Referenzen:

+0

Es funktioniert nicht !!! –

Verwandte Themen