2013-07-10 8 views
19

Chcę użyć automatycznego układu dla UITableViewCells. Te komórki tabeli mają dynamiczną wysokość (w zależności od długości tekstu).Wywołanie "[UIView -systemLayoutSizeFittingSize:]` na UITableViewCell zawsze kończy się niepowodzeniem

Używam [UIView -systemLayoutSizeFittingSize:] obliczyć odpowiednią wysokość komórek (aby powrócić w [UITableView -heightForRowAtIndexPath:]), ale wciąż otrzymuję następujące wyniki:

  • Jeśli mijam UILayoutFittingCompressedSize, dostaję z powrotem CGSize od (0, 0).

  • Jeśli mijam UILayoutFittingExpandedSize moje app ulega awarii z tego błędu:

    *** Assertion failure in -[NSISLinearExpression incrementConstant:], /SourceCache/Foundation_Sim/Foundation-1043.1/Layout.subproj/IncrementalSimplex/NSISLinearExpression.m:620

(Domyślam się, że oznacza to niektóre liczba jest nieskończona.)

Moja implementacja jest prosta. Obliczyć wysokość dla każdego obiektu, a następnie buforować go:

MessageCell *cell = // allocate a new cell... 

// set up the cell (assign text, images, etc) 

CGSize size = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

self.cellHeight = size.height; // size always equals (0, 0) 

I hipotezę, że jest to problem z ograniczeniami ustawić, ale:

  • Gdybym ręcznie ustawić cellHeight dużej wartości , wszystkie komórki wyglądają dobrze, ale wysokość jest zła.
  • Program Interface Builder nie daje mi żadnych ostrzeżeń dotyczących niejednoznacznych ograniczeń
  • [cell hasAmbiguousLayout] zwraca NO.
  • Moja komórka ma, między innymi, obraz ustawiony na 48x48, więc rozmiar (0, 0) nie powinien spełniać wszystkich ograniczeń.

Wszelkie pomysły?

+1

spotykam ten sam błąd, jak Twoje, masz go naprawić? – ygweric

Odpowiedz

34

To, co działa dla mnie (uwaga „contentView”)

CGSize size = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

EDIT: i odpowiedział na podobne pytanie i dostarcza pełny przykład tutaj:

How to resize superview to fit all subviews with autolayout?

+1

To działało dla mnie. – Camsoft

+0

To był klucz do mnie. Jeśli mam poprawnie ustawione ograniczenia układu graficznego, wszystko, co muszę zrobić w [UITableView -heightForRowAtIndexPath:], to return [cell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize] .height; i wiersze zmieniają rozmiar na nowy układ. Prosty. –

2

Trudno powiedzieć coś konkretnego na podstawie swojego wpisu, ponieważ nie używałeś ograniczeń, których używasz. Jabłko Dokumentacja:

systemLayoutSizeFittingSize:

Returns the size of the view that satisfies the constraints it holds.

Może stworzony ograniczeń, które mogą być interpretowane w sposób wielkość komórki jest równa (0,0).

Istnieje inny sposób sprawdzenia wysokości komórki za pomocą tekstu. Możesz umieścić swój tekst w UITextView, a następnie:

UITextView textView; 
textView.text = @"l"; 
textView.font = [UIFont fontWithName:FONT_NAME size:FONT_SIZE]; 
//some code here 
// 
CGFloat cellHeight = textView.contentSize.height; 

Ważne jest, aby ustawić tekst i czcionki (i każdą inną właściwość, która może spowodować zmianę wysokości UITextView) z UITextView przed użyciem contentSize własność. Ponadto musisz najpierw dodać UITextView do widoku.

////// EDIT

Problem z podejściem z użyciem ograniczeń może być tak, że chcesz mierzyć komórkę, która nie została dodana do widoku więc system nie mają wszystko potrzebne informacje.Nie wiem, jak dużo miejsca, które będzie dla przestrzeni etc, ponieważ nie zna okolicę komórki

+0

To ostatnie podejście jest tym, co teraz robię i co chcę przestać robić. (No cóż, używam '[NSString -sizeWithFont: constrainedToSize:]', ale ten sam podstawowy pomysł). Moja UITableViewCell zawiera widok podrzędny, UIImageView, z czterema ograniczeniami (wysokość = 48, szerokość = 48, przestrzeń prowadząca do kontenera = 10, górna przestrzeń do kontenera = 10). Czy nie powinno to sprawić, że 'systemLayoutSizeFittingSize:' zwróci minimum (58, 58)? –

+0

Wygląda na to, że powinien zadziałać. Trzymasz swój obraz w UIImageView i jest on dodawany do widoku komórki? Myślę również, że ten pomysł z użyciem UITextView jest prawdopodobnie lepszy niż przy użyciu metod NSString, ponieważ miałem pewne problemy z NSStringiem podczas pracy z ciągami wielowierszowymi. –