2014-09-26 8 views
15

więc jestem w stanie ustawić wysokość dynamicznych wielkości z układem automatycznego kiedy mam tylko jedną etykietę, która zmienia wysokość w oparciu o długość ciąg znaków. Moim problemem jest to, że jeśli dodam kolejny UILabel, który powinien zrobić to samo, rzeczy nie działają.iOS 7/8 UITableView komórek: Dwa UILabels z wysokości z dynamicznym układzie auto dla zmiennej wysokości rzędu

ja ustawienie zarówno priorytet przytulanie zawartość i kompresji Odporność na 1000 dla obu == dostaję ostrzeżenia dwuznaczności

Jeżeli ustawić przytulanie zawartość (pionowy) dla drugiego UILabel do 999 lub 250, a następnie go działa świetnie, ale tylko wtedy, gdy druga etykieta ma 2 lub więcej linii. Jeśli druga etykieta jest pusta lub ma tylko jeden wiersz, wysokość heightForRowAtIndexPath systemLayoutSizeFittingSize: UILayoutFittingCompressedSize zwraca duże wartości, a komórki mają duże spacje.

ja też bawił się z wewnętrzną Rozmiar: Domyślny lub zastępczy (z kilku wysokościach i szerokościach), ale to nie pomaga.

Anyone jakieś sugestie co można zrobić?

Odpowiedz

18

Mam to działa w końcu. Rozwiązaniem było dla mnie jawne ustawienie preferowanej szerokości na aktualną szerokość ramki. Tak więc w zasadzie sprawdzanie znacznika wyboru Explicit na etykiecie> Preferowana szerokość w Inspektorze rozmiarów.

ref: http://www.raywenderlich.com/73602/dynamic-table-view-cell-height-auto-layout pobierz przykładowy kod i zobacz konfigurację storyboardu.

+0

Czy twój UILabel miał stałą szerokość? –

+0

Nie, obsługuję różne rozmiary urządzeń, więc szerokość zależy od tego. – Zsolt

+2

Dla mnie brakowało elementu ustawiającego Treść Przytulanie i Priorytet Odporności na Kompresję Treści zarówno dla tytułu mojej komórki, jak i napisów podtytułowych, jak pokazano w samouczku Ray'a Wenderlicha. – Daniel

0

Aby ustawić priorytet mnie treści tulenie i treści priorytet niższą wytrzymałość na ściskanie do jednego elementu działało zgodnie z oczekiwaniami.

1

Dla mnie zajęło to kombinacja kilku rzeczy.

  • Oprócz ustawiania przytulanie treści i odporność poprawnego
  • musiałem zrobić podklasę UILabel obsłużyć preferredMaxLayoutWidth etykiety
  • i poprawić błąd w intrinsicContentSize także

Subklasa UILabel wyglądała tak:

@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 

Obok s To wywołanie layoutIfNeeded na komórce przed uzyskaniem wysokości w tableView heightForRowAtIndexPath: spowodowało, że wiązania były gotowe przed użyciem metody systemLayoutSizeFittingSize: w contentView. Wygląda jak poniżej:

- (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; 
} 

Odniesienia:

+0

To nie działa !!! –

Powiązane problemy