Wykryto przypadek, w którym ograniczenia niejednoznacznie sugerują wysokość zero

120

Po aktualizacji do Xcode 6.1 beta 2, gdy uruchamiam aplikację zawierającą komórki z widokiem tabeli, asystent debugowania mówi:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Wcześniej, gdy używałem Xcode 5 w tym projekcie, otrzymywałem kilka błędów, ale te zniknęły od czasu aktualizacji. Nie mam teraz żadnych innych błędów ani ostrzeżeń. Próbowałem już dostosować rozmiary wszystkich komórek widoku tabeli, a także próbowałem użyć standardowej wysokości, ale nadal otrzymuję to samo ostrzeżenie:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.

Przeczytałem również wszystkie podobne tematy na ten temat, ale żadne z ich rozwiązań nie pomaga. Kiedy testuję aplikację za pomocą symulatora, aplikacja działa dobrze, z wyjątkiem obrazów, które powinny znajdować się w komórkach tableView.

David E.
źródło
2
Otrzymuję ten sam błąd dla komórki widoku kolekcji. Co dla tego robię. Jakieś sugestie.
python
Może powinieneś sprawdzić, czy już dodałeś plik xib do docelowego stackoverflow.com/a/26870331/1418457
onmyway133
Zdarzyło mi się to na iOS 8.1, ale już nie na iOS 8.4. Jeśli podałeś wysokość, myślę, że to tylko błąd Xcode.
samwize

Odpowiedzi:

126

Jak dotąd trzy rzeczy zdołały uciszyć to ostrzeżenie. Możesz wybrać najwygodniejszy dla siebie. Ale nic ładnego.

  • Aby ustawić domyślną wysokość komórki w viewDidLoad

    self.tableView.rowHeight = 44;
  • Przejdź do scenorysu i zmień wysokość wiersza w widoku tabeli na inną niż 44.

  • Aby zaimplementować metodę delegata tabeli heightForRowAtIndexPath

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 44;
    }

Dziwne.

Viktor Kucera
źródło
Próbowałem również użyć twojej metody, ale muszę dodać @property dla rowHeight, ale nie znam prawidłowego typu obiektu do użycia
David E
Być może nie dostałem Twojej notatki, ale rowHeight jest właściwością UITableView. Po prostu podłącz swój stół do jakiegoś gniazdka i to wszystko.
Viktor Kucera,
4
Dzieje się tak, ponieważ jeśli zachowasz wartość 44 punktów w IB, rozważy to, że chcesz użyć komórek o rozmiarze samoczynnym. stackoverflow.com/questions/25888126/… (ale tak, to rzeczywiście dziwne zachowanie)
Guillaume Algis
Najwyraźniej miałem dwie metody viewDidLoad i wstawiłem self.tableView.rowHeight = 44;niewłaściwą. Błąd zniknął! dzięki
David E
Dziękuję Guillaume Algis za wyjaśnienie tego. Jednak nadal jest bardzo przerażające.
Viktor Kucera,
216

Napotykasz efekt uboczny fantastycznej nowej funkcji w Tableviews w iOS8: Automatic Row Heights.

W iOS 7 albo miałeś wiersze o stałym rozmiarze (ustawionym za pomocą tableView.rowHeight), albo pisałeś kod, aby obliczyć wysokość twoich komórek i zwracałeś to w tableView:heightForRowAtIndexPath. Pisanie kodu do obliczania wysokości komórki może być dość skomplikowane, jeśli masz wiele widoków w komórce i różne wysokości do rozważenia przy różnych rozmiarach czcionek. Dodaj typ dynamiczny, a proces był upierdliwy.

W iOS 8 nadal możesz to zrobić, ale teraz wysokość wierszy może być określona przez iOS, pod warunkiem, że skonfigurowałeś zawartość komórki za pomocą automatycznego układu. Jest to ogromna korzyść dla programistów, ponieważ gdy zmienia się dynamiczny rozmiar czcionki lub użytkownik modyfikuje rozmiar tekstu za pomocą ustawień ułatwień dostępu, interfejs użytkownika może dostosować się do nowego rozmiaru. Oznacza to również, że jeśli masz UILabel, który może mieć wiele wierszy tekstu, twoja komórka może teraz rosnąć, aby pomieścić te, gdy komórki tego potrzebują, i zmniejszać się, gdy nie jest, więc nie ma niepotrzebnych spacji.

Komunikat ostrzegawczy, który widzisz, informuje Cię, że w komórce nie ma wystarczającej liczby ograniczeń, aby funkcja Auto Layout poinformowała widok tabeli o wysokości komórki.

Aby użyć dynamicznej wysokości komórki, która wraz z technikami wspomnianymi już na innych plakatach również pozwoli pozbyć się tej wiadomości, musisz upewnić się, że Twoja komórka ma wystarczające ograniczenia, aby powiązać elementy interfejsu użytkownika z górną i dolną częścią komórki. Jeśli wcześniej korzystałeś z automatycznego układu, prawdopodobnie jesteś przyzwyczajony do ustawiania ograniczeń górny + wiodący, ale dynamiczna wysokość wiersza wymaga również ograniczeń dolnych.

Przebieg układu działa w następujący sposób, który następuje bezpośrednio przed wyświetleniem komórki na ekranie w sposób just-in-time:

  1. Obliczane są wymiary treści z wewnętrznymi rozmiarami. Obejmuje to UILabels i UIImageViews, gdzie ich wymiary są oparte odpowiednio na tekście lub UIImages, które zawierają. Oba te widoki uznają swoją szerokość za znaną (ponieważ ustawiłeś ograniczenia dla krawędzi końcowych / przednich, ustawiłeś jawne szerokości lub użyłeś ograniczeń poziomych, które ostatecznie ujawniają szerokość z boku na bok). Załóżmy, że etykieta zawiera akapit tekstu („liczba wierszy” jest ustawiona na 0, więc będzie się automatycznie zawijać), może mieć tylko 310 punktów w poprzek, więc przy obecnym rozmiarze czcionki jest określona na 120 punktów wysokości.

  2. Interfejs użytkownika jest ułożony zgodnie z ograniczeniami dotyczącymi pozycjonowania. U dołu etykiety znajduje się ograniczenie, które łączy się z dolnym marginesem komórki. Ponieważ etykieta urosła do 120 punktów wysokości i jest związana z dnem komórki przez ograniczenie, musi popchnąć komórkę „w dół” (zwiększając wysokość komórki), aby spełnić ograniczenie, które mówi „dół” etykieta jest zawsze w standardowej odległości od spodu komórki.

Zgłoszony przez Ciebie komunikat o błędzie pojawia się, jeśli brakuje tego dolnego ograniczenia. W takim przypadku nie ma nic, co mogłoby „odepchnąć” dół komórki od górnej części komórki, co jest zgłaszaną niejednoznacznością: nie ma z czego wypychać dół u góry komórka zapada się. Ale Auto Layout również to wykrywa i powraca do używania standardowej wysokości wiersza.

Co jest warte, a przede wszystkim, aby uzyskać zaokrągloną odpowiedź, jeśli wdrażasz dynamiczne wysokości wierszy oparte na automatycznym układzie iOS 8, powinieneś zaimplementować tableView:estimatedHeightForRowAtIndexPath:. Ta metoda szacowania może używać przybliżonych wartości dla komórek i zostanie wywołana po pierwszym załadowaniu widoku tabeli. Pomaga UIKit rysować rzeczy takie jak pasek przewijania, którego nie można narysować, chyba że widok tabeli wie, ile treści może przewijać, ale nie potrzebuje całkowicie dokładnych rozmiarów, ponieważ jest to tylko pasek przewijania. Dzięki temu obliczenie rzeczywistej wysokości wiersza może zostać odroczone do momentu, w którym komórka jest potrzebna, co jest mniej intensywne obliczeniowo i umożliwia szybsze przedstawienie UITableView.

Woodster
źródło
3
To jest świetne wyjaśnienie głównej przyczyny tego ostrzeżenia. Wielkie dzięki za poświęcony czas, Woodster!
Golden Thumb
4
Tak jak powiedział Woodster, przegapiłem część ograniczeń .Bottom. Po dodaniu mój problem został rozwiązany.
Golden Thumb
Po wypróbowaniu prawie 20 rzeczy, jest to jedyna, która zadziałała!
Julio Rodrigues
Ten człowiek to załatwił! Zasługuje na to i popiera i to musi być zaakceptowana odpowiedź. +1
Karaiby
1
Zobacz tę odpowiedź stackoverflow.com/a/29565073/4080860 , aby dowiedzieć się, w której komórce brakuje ograniczeń.
hhanesand
11

Miałem ten problem po utworzeniu niestandardowego UITableViewCelli dodaniu moich podglądów do komórki zamiast jej contentView.

ABakerSmith
źródło
10

Aby rozwiązać ten problem bez metody programowej, dostosuj wysokość wiersza widoku tabeli w Inspektorze rozmiaru z serii ujęć.

wprowadź opis obrazu tutaj

Anconia
źródło
Najlepsze rozwiązanie dla mnie, ponieważ używa elementów scenorysu zamiast linii kodu.
zyc
6

To jest problem z automatycznym układem. Upewnij się, że podglądy podrzędne mają wszystkie ograniczenia. W moim przypadku brakowało ograniczenia dolnego dla etykiety tytułu w komórce. Kiedy to dodałem, ostrzeżenie zniknęło i wszystko pokazało się idealnie.

Alok
źródło
Nie wiem, dlaczego ten głos został odrzucony, ponieważ jest to doskonała odpowiedź. Zobacz tutaj, aby uzyskać pomoc dotyczącą ustalenia, która komórka ma problemy z układaniem stackoverflow.com/a/29565073/4080860
hhanesand
5

Po prostu włącz samoczynne ustalanie rozmiaru komórek widoku tabeli

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

I upewnij się, że dodane ograniczeń na wszystkich stronach UITableViewCellas-

wprowadź opis obrazu tutaj

Jacek
źródło
Faktycznie, ostrzeżenie odszedł kiedy niepełnosprawnym samodzielne sizig komórki tableview.
turingtestowane
@turingtested należy włączyć samoczynną zmianę rozmiaru komórki tabeli, aby zapewnić obsługę na różnych urządzeniach.
Jack
Zgadzam się, ale przeczytaj oryginalne pytanie. Chodziło mi o to, że zaproponowane przez Ciebie rozwiązanie nie zadziałało, przynajmniej nie dla mnie.
test turinga
FYI UITableViewAutomaticDimensionzostała zmieniona naUITableView.automaticDimension
atineoSE,
5

Jeśli używasz komórki statycznej lub komórki dynamicznej, po prostu dodaj trochę wysokości wiersza do widoku tabeli w tabeli inspektora i odznacz opcję automatyczną po prawej stronie wysokości wiersza, to oznacza, że ​​przestaniesz otrzymywać to ostrzeżenie.wprowadź opis obrazu tutaj

Amit Verma
źródło
Okazało się, że skuteczniejsze jest przeciwieństwo: ustaw jawną szacowaną wysokość i pozwól, aby sama wysokość wiersza była automatyczna.
NRitH
4

Dostałem dziś to ostrzeżenie. Oto, co sprawiło, że zniknął dla mnie (w kreatorze interfejsów)

1. Ustaw pole wysokości wiersza dla widoku tabeli na inne niż 44 2 Ustaw pole wysokości wiersza dla komórki tableView na inne niż 44

Nie musiałem dokonywać żadnych zmian w kodzie

pokornyPilgrim
źródło
3

W moim przypadku programowo budowałem komórkę i ciągle otrzymywałem ten błąd.

Byłem dodawanie subviews i ograniczeń w UITableViewCell„s initmetody takie jak to:

addSubview(rankingLabel)
addConstraints(cellConstraints)

Rozwiązałem problem, dodając je do komórki contentView:

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)
gohnjanotis
źródło
1
Zawsze dodawaj podziały do contentView, a nie UITableViewCellbezpośrednio.
dinesharjani
3

Ustaw szacowaną wysokość wiersza na zero, a ostrzeżenie zniknie:

wprowadź opis obrazu tutaj

TruMan1
źródło
Prawdziwym problemem jest gdzieś brakujące ograniczenie. Prawdopodobnie wprowadzasz coś pionowo, zamiast ustawiać ograniczenia górne / dolne
TruMan1
1

Ja też doświadczyłem tego ostrzeżenia, przechodząc na Xcode 6 GM. Otrzymałem ostrzeżenie tylko wtedy, gdy obróciłem urządzenie z powrotem do pierwotnej pozycji.

Używam niestandardowych UITableViewCells. Widok tabeli scenorysu jest ustawiony na mój niestandardowy rozmiar (w moim przypadku 100,0). Chociaż komórki tabeli renderują się poprawnie, tak jak w poprzednich wersjach, nie podobał mi się komunikat ostrzegawczy.

Oprócz powyższych pomysłów dodałem to

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100.0;
}

Renderowanie ekranu ... reaguje na obrót i nie ma więcej komunikatów ostrzegawczych.

DannyJi
źródło
Więc próbowałem użyć twojej metody, używając linii, którą mi podałeś, ale wciąż pojawia się ten sam błąd. Nie używam też rotacji w mojej aplikacji.
David E
1

W xcode 6.0.1 usunąłem te ostrzeżenia, określając wysokość wiersza za pomocą:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44.0;
}
Fantini
źródło
1

Jeśli utworzyłeś niestandardową tableViewCell dla tableView, upewnij się, że dałeś komórkom zarówno dolne, jak i górne ograniczenia, możesz również otrzymać ten komunikat, jeśli podglądy podrzędne w niestandardowych komórkach są wyrównane w środku Y, co nie wyskoczy żadnego komunikatu o błędzie, ale zepsuje się z identyfikacją wysokości wiersza dla widoku tabeli po kolei, jak na załączonym obrazku , tutaj mamy zarówno górne, jak i dolne ograniczenia

Podczas tworzenia niestandardowej komórki dla tableView musisz określić wysokość wiersza lub górne i dolne ograniczenia dla niestandardowych widoków podrzędnych komórki w komórce (np. Etykieta w niestandardowej komórce, jak na poniższym obrazku)

Ale jeśli to nie zadziała, możesz spróbować ustawić wysokość wiersza dla swojej komórki, zamiast robić to automatycznie, jak na tym obrazku

Ale upewnij się, że jeśli wyłączysz to automatyczne zaznaczenie, musisz dostosować rozmiar wiersza do zmian programowych, które można było zrobić automatycznie

dół potwora
źródło
0

W scenorysie ustaw cell Row heightpole o takiej samej wartości jak Row heightwtableView (oba z tą samą wartością działały dla mnie).

Jeśli dodasz heightForRowAtIndexPathfunkcję do swojego kodu, może to spowodować problem z wydajnością, ponieważ zostanie wywołana dla każdej komórki, więc bądź ostrożny.

Daniel Gomez Rico
źródło
0

Możesz również zobaczyć ten komunikat, jeśli Twoje jedyne ograniczenia są ustawione na wyrównanie wszystkich elementów w pionie i nie masz / nie chcesz określonej wysokości komórki. Jeśli ustawisz górne / dolne ograniczenie dla elementu, ostrzeżenie zniknie.

Micah Montoya
źródło
0

Miałem ten problem, gdy moje etykiety i widoki w niestandardowym tableViewCell były ograniczone do customCell, a nie jego widoku zawartości. Kiedy usunąłem ograniczenia i połączyłem je z komórkami Content View, problem został rozwiązany.

Marija Zivkovic
źródło
0

Otrzymałem ten sam komunikat o błędzie, upewnij się, że wszystkie punkty sprzedaży są prawidłowe, takie jak widok tabeli i ograniczenia dotyczące widoku tabeli

Gulz
źródło
0

Jeśli wykonujesz dynamiczne obliczenia wysokości,

  • powinieneś mieć wszystkie elementy połączone ze sobą w kategoriach ograniczeń, takich jak góra i dół.
  • zdecydowanie powinieneś mieć ograniczenie dołu , które jest połączone z elementem na dole komórki
S. Mert
źródło
0

Mam również podobny problem z niestandardową komórką widoku tabeli, która ma dynamiczną wysokość wiersza. Dynamiczna wysokość nie została odbita i otrzymała to samo ostrzeżenie w konsoli. Rozwiązaniem jest dodanie podglądów podrzędnych do komórki zamiast contentView. Przy okazji, stworzyłem podglądy programowo.

Srinivas G
źródło
0

Mam ten problem na TableViewCells, gdzie ograniczenia są ustawione na inicjalizację, ale gdzie zawartość komórki jest ładowana później, oznacza to, że silnik autoukładu nie może określić wysokości. Inne rozwiązania tutaj nie działają, ponieważ potrzebuję wysokości komórki UITableView.automaticDimension.

Właśnie dodałem dodatkowe ograniczenie do komórki:

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)
Leon
źródło
0

Otrzymałem dziś to ostrzeżenie. Wszystko, co zrobiłem, to po prostu dodanie jednej dodatkowej linii do mojego kodu

tableView.rowHeight = 200;

dodaj tę linię kodu wewnątrz

func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
  ...
}

a końcowy kod wygląda jak

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  tableView.rowHeight = 200;
  ...
}

ten kod zwiększy wysokość komórki wiersza tabeli do 200, domyślna wysokość to 44

SudhakarH
źródło
-1

Mam ten sam błąd, z powodu tej linii ten błąd został pokazany

self.layer.backgroundColor = UIColor (white: 1, alpha: 0,2) as! CGColor

Po prostu zmieniam wiersz w następujący sposób, aby naprawić błąd

self.layer.backgroundColor = UIColor (biały: 1, alfa: 0,2) .cgColor

Malik Hassnain
źródło