Es wurde ein Fall festgestellt, in dem Einschränkungen mehrdeutig eine Höhe von Null vorschlagen

120

Nach dem Update auf Xcode 6.1 Beta 2 beim Ausführen meiner App, die Tabellenansichtszellen enthält, sagt der Debug-Assistent:

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.

Früher, als ich Xcode 5 für dieses Projekt verwendet habe, habe ich einige Fehler erhalten, aber diese sind seit dem Upgrade verschwunden. Ich habe jetzt keine weiteren Fehler oder Warnungen. Ich habe bereits versucht, die Größe aller Tabellenansichtszellen anzupassen, und habe auch versucht, die Standardhöhe zu verwenden, erhalte jedoch immer noch die gleiche Warnung:

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.

Ich habe auch alle ähnlichen Themen zu diesem Thema gelesen, aber keine ihrer Lösungen hilft. Wenn ich die App mit dem Simulator teste, läuft die App einwandfrei, außer dass die Bilder, die sich in den tableView-Zellen befinden sollen, nicht vorhanden sind.

David E.
quelle
2
Ich erhalte den gleichen Fehler für die Zelle der Sammlungsansicht. Was ich dafür mache. Irgendwelche Vorschläge.
Python
Vielleicht sollten Sie überprüfen, ob Sie die xib-Datei bereits zum Ziel stackoverflow.com/a/26870331/1418457
onmyway133
Dies ist mir unter iOS 8.1 passiert, aber nicht mehr unter iOS 8.4. Wenn Sie die Höhe angegeben haben, ist dies vermutlich nur ein Xcode-Fehler.
Samwize

Antworten:

126

Drei Dinge haben es bisher geschafft, diese Warnung zum Schweigen zu bringen. Sie können das für Sie bequemste abholen. Nichts hübsches.

  • So richten Sie die Höhe der Standardzelle in viewDidLoad ein

    self.tableView.rowHeight = 44;
  • Gehen Sie zum Storyboard und ändern Sie die Zeilenhöhe in Ihrer Tabellenansicht auf etwas anderes als 44.

  • So implementieren Sie die Delegatmethode heightForRowAtIndexPath von tableview

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

Seltsam.

Viktor Kucera
quelle
Ich habe auch versucht, Ihre Methode zu verwenden, aber ich muss eine @ -Eigenschaft für rowHeight hinzufügen, aber ich kenne nicht den richtigen Objekttyp
David E
Ich habe Ihre Notiz möglicherweise nicht erhalten, aber rowHeight ist eine Eigenschaft von UITableView. Schließen Sie einfach Ihren Tisch an eine Steckdose an und fertig.
Viktor Kucera
4
Dies liegt daran, dass Sie, wenn Sie den 44pt-Wert in IB beibehalten, davon ausgehen möchten, dass Sie Zellen mit Selbstgröße verwenden möchten. stackoverflow.com/questions/25888126/… (aber ja, das ist in der Tat ein seltsames Verhalten)
Guillaume Algis
Anscheinend hatte ich zwei viewDidLoad-Methoden und habe self.tableView.rowHeight = 44;die falsche eingefügt . Der Fehler ging weg! danke
David E
Vielen Dank an Guillaume Algis, dass er dies klarer gemacht hat. Es ist immer noch sehr gruselig.
Viktor Kucera
216

In den Tabellenansichten von iOS8 stoßen Sie auf den Nebeneffekt einer fantastischen neuen Funktion: Automatische Zeilenhöhen.

In iOS 7 hatten Sie entweder Zeilen mit einer festen Größe (festgelegt mit tableView.rowHeight), oder Sie haben Code geschrieben, um die Höhe Ihrer Zellen zu berechnen, und Sie haben diesen zurückgegeben tableView:heightForRowAtIndexPath. Das Schreiben von Code zur Berechnung der Höhe einer Zelle kann sehr komplex sein, wenn Sie zahlreiche Ansichten in Ihrer Zelle hatten und unterschiedliche Höhen bei unterschiedlichen Schriftgrößen zu berücksichtigen hatten. Fügen Sie in Dynamic Type und der Prozess war ein Schmerz im Arsch.

In iOS 8 können Sie die oben genannten Schritte weiterhin ausführen. Jetzt kann die Höhe der Zeilen von iOS bestimmt werden, sofern Sie den Inhalt Ihrer Zelle mithilfe des automatischen Layouts konfiguriert haben. Dies ist ein großer Vorteil für Entwickler, da sich Ihre Benutzeroberfläche an die neue Größe anpassen kann, wenn sich die dynamische Schriftgröße ändert oder der Benutzer die Textgröße mithilfe der Eingabehilfeneinstellungen ändert. Wenn Sie über ein UILabel verfügen, das mehrere Textzeilen enthalten kann, kann Ihre Zelle jetzt vergrößert werden, um diese zu berücksichtigen, wenn die Zellen dies benötigen, und verkleinert werden, wenn dies nicht der Fall ist, sodass keine unnötigen Leerzeichen vorhanden sind.

Die angezeigte Warnmeldung weist Sie darauf hin, dass in Ihrer Zelle nicht genügend Einschränkungen für das automatische Layout vorhanden sind, um die Tabellenansicht über die Höhe der Zelle zu informieren.

Um die dynamische Zellenhöhe zu verwenden, die zusammen mit den bereits von anderen Postern erwähnten Techniken diese Meldung beseitigt, müssen Sie sicherstellen, dass Ihre Zelle über ausreichende Einschränkungen verfügt, um die UI-Elemente an den oberen und unteren Rand der Zelle zu binden . Wenn Sie zuvor das automatische Layout verwendet haben, sind Sie wahrscheinlich daran gewöhnt, Einschränkungen für Top + Leading festzulegen. Für die dynamische Zeilenhöhe sind jedoch auch Bottom-Einschränkungen erforderlich.

Der Layout-Durchlauf funktioniert so, dass er unmittelbar vor der Anzeige einer Zelle auf dem Bildschirm just-in-time ausgeführt wird:

  1. Die Abmessungen für Inhalte mit Eigengrößen werden berechnet. Dies umfasst UILabels und UIImageViews, deren Abmessungen auf dem Text bzw. den darin enthaltenen UIImages basieren. In beiden Ansichten wird ihre Breite als bekannt angesehen (weil Sie Einschränkungen für Hinter- / Vorderkanten festgelegt oder explizite Breiten festgelegt oder horizontale Einschränkungen verwendet haben, die schließlich eine Breite von Seite zu Seite anzeigen). Angenommen, ein Etikett enthält einen Textabschnitt ("Anzahl der Zeilen" wird auf 0 gesetzt, damit es automatisch umbrochen wird). Es kann nur einen Durchmesser von 310 Punkten haben, sodass bei der aktuellen Schriftgröße eine Höhe von 120pt festgelegt wird.

  2. Die Benutzeroberfläche richtet sich nach Ihren Positionierungsbeschränkungen. Am unteren Rand des Etiketts befindet sich eine Einschränkung, die mit dem unteren Rand der Zelle verbunden ist. Da das Etikett auf 120 Punkte angewachsen ist und durch die Einschränkung an den unteren Rand der Zelle gebunden ist, muss es die Zelle "nach unten" drücken (wodurch die Höhe der Zelle erhöht wird), um die Einschränkung zu erfüllen, die "unten von" lautet Das Etikett ist immer der Standardabstand vom unteren Rand der Zelle.

Die von Ihnen gemeldete Fehlermeldung tritt auf, wenn diese untere Einschränkung fehlt. In diesem Fall gibt es nichts, was den unteren Teil der Zelle vom oberen Rand der Zelle wegschieben könnte. Dies ist die Mehrdeutigkeit, die gemeldet wird: Es gibt nichts, von dem aus der untere Rand verschoben werden kann Oben bricht die Zelle zusammen. Das automatische Layout erkennt dies jedoch ebenfalls und verwendet wieder die Standardzeilenhöhe.

Wenn Sie die auf automatischem Layout basierenden dynamischen Zeilenhöhen von iOS 8 implementieren, sollten Sie diese implementieren, um eine abgerundete Antwort zu erhalten tableView:estimatedHeightForRowAtIndexPath:. Diese Schätzmethode kann grobe Werte für Ihre Zellen verwenden und wird aufgerufen, wenn die Tabellenansicht zum ersten Mal geladen wird. Es hilft UIKit beim Zeichnen von Dingen wie der Bildlaufleiste, die nur gezeichnet werden können, wenn die Tabellenansicht weiß, durch wie viel Inhalt sie scrollen kann, aber keine absolut genauen Größen benötigt, da es sich nur um eine Bildlaufleiste handelt. Auf diese Weise kann die Berechnung der tatsächlichen Zeilenhöhe bis zu dem Zeitpunkt verschoben werden, an dem die Zelle benötigt wird. Dies ist weniger rechenintensiv und ermöglicht eine schnellere Darstellung Ihrer UITableView.

Woodster
quelle
3
Dies ist eine gute Erklärung für den Grund dieser Warnung. Vielen Dank für deine Zeit, Woodster!
Goldener Daumen
4
Wie Woodster sagte, habe ich den unteren Teil der Einschränkungen verpasst. Als hinzugefügt wurde mein Problem gelöst.
Goldener Daumen
Nachdem Sie fast 20 Dinge ausprobiert haben, ist dies die einzige, die funktioniert hat!
Julio Rodrigues
Dieser Mann hat es geschafft! Er verdient und stimmt zu und dies muss die akzeptierte Antwort sein. +1
Karibik
1
In dieser Antwort auf stackoverflow.com/a/29565073/4080860 können Sie herausfinden, in welcher Zelle Einschränkungen fehlen.
Hhanesand
11

Ich hatte dieses Problem, nachdem ich eine benutzerdefinierte UITableViewCellDatei erstellt und meine Unteransichten anstelle der Zelle zur Zelle hinzugefügt hatte contentView.

ABakerSmith
quelle
10

Um dies ohne eine programmatische Methode zu beheben, passen Sie die Zeilenhöhe der Tabellenansicht im Größeninspektor des Storyboards an.

Geben Sie hier die Bildbeschreibung ein

Anconia
quelle
Die beste Lösung für mich, weil ich die Storyboard-Inhalte anstelle von Codezeilen verwende.
Zyc
6

Dies ist ein Autolayout-Problem. Stellen Sie sicher, dass Ihre Unteransichten alle Einschränkungen aufweisen. Für mich fehlte die unterste Einschränkung für die Titelbezeichnung in der Zelle. Als ich das hinzufügte, verschwand die Warnung und alles zeigte sich perfekt.

Alok
quelle
Ich weiß nicht, warum dies abgelehnt wurde, da es eine vollkommen gute Antwort ist. Hier finden Sie Hilfe, um herauszufinden, welche Zelle Probleme beim Anlegen
hhanesand
5

Aktivieren Sie einfach Self-Sizing Table View Cells

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

& UITableViewCellStellen Sie sicher, dass Sie Einschränkungen auf allen Seiten von as- hinzugefügt haben.

Geben Sie hier die Bildbeschreibung ein

Jack
quelle
Tatsächlich verschwand die Warnung, als ich selbstansichtende Tabellenansichtszellen deaktivierte .
Turing getestet
@turingtested Sie sollten die selbstansichtende Tabellenansichtszelle aktivieren, um Unterstützung auf verschiedenen Geräten zu bieten.
Jack
Stimmen Sie zu, aber bitte lesen Sie die ursprüngliche Frage. Was ich damit meinte war, dass Ihre vorgeschlagene Lösung nicht funktionierte, zumindest nicht für mich.
Turing getestet
FYI UITableViewAutomaticDimensionwurde umbenannt inUITableView.automaticDimension
atineoSE
5

Wenn Sie eine statische oder dynamische Zelle verwenden, fügen Sie der Tabellenansicht in der Inspektortabelle einfach eine Zeilenhöhe hinzu und deaktivieren Sie die automatische Option auf der rechten Seite der Zeilenhöhe. Dadurch wird diese Warnung nicht mehr angezeigt.Geben Sie hier die Bildbeschreibung ein

Amit Verma
quelle
Ich fand das Gegenteil effektiver: Legen Sie eine explizite geschätzte Höhe fest und lassen Sie die Zeilenhöhe selbst automatisch sein.
NRitH
4

Ich habe heute diese Warnung erhalten. Hier ist, was es für mich verschwinden ließ (im Interface Builder)

1.Stellen Sie das Zeilenhöhenfeld für die Tabellenansicht auf einen anderen Wert als 44 ein. 2 Setzen Sie das Zeilenhöhenfeld für die tableView-Zelle auf einen anderen Wert als 44

Ich musste keine Änderungen am Code vornehmen

bescheidenPilgrim
quelle
3

In meinem Fall habe ich die Zelle programmgesteuert erstellt und immer wieder diesen Fehler erhalten.

Ich habe die Unteransichten und Einschränkungen in der Methode der UITableViewCell' initwie folgt hinzugefügt :

addSubview(rankingLabel)
addConstraints(cellConstraints)

Ich habe das Problem gelöst, indem ich sie contentViewstattdessen zu den Zellen hinzugefügt habe :

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)
gohnjanotis
quelle
1
Fügen Sie immer Unteransichten zum contentView, nicht UITableViewCelldirekt zum hinzu.
Dinesharjani
3

Setzen Sie die geschätzte Zeilenhöhe auf Null und die Warnung verschwindet:

Geben Sie hier die Bildbeschreibung ein

TruMan1
quelle
Das eigentliche Problem ist eine fehlende Einschränkung irgendwo. Sie geben wahrscheinlich etwas vertikal ein, anstatt obere / untere Einschränkungen
festzulegen
1

Auch ich habe diese Warnung beim Wechsel zu Xcode 6 GM erlebt. Ich erhielt die Warnung erst, als ich das Gerät wieder in seine ursprüngliche Position drehte.

Ich verwende benutzerdefinierte UITableViewCells. Die Storyboard-Tabellenansicht ist auf meine benutzerdefinierte Größe eingestellt (in meinem Fall 100,0). Während die Tabellenzellen wie in früheren Versionen ordnungsgemäß gerendert wurden, gefiel mir keine Warnmeldung.

Zusätzlich zu den oben genannten Ideen habe ich dies hinzugefügt

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

Bildschirm rendert ... reagiert auf Rotation und keine Warnmeldungen mehr.

DannyJi
quelle
Also habe ich versucht, Ihre Methode mit der Zeile zu verwenden, die Sie mir gegeben haben, aber ich habe immer noch den gleichen Fehler. Ich habe auch keine Rotation in meiner App verwendet.
David E
1

In xcode 6.0.1 hatte ich diese Warnungen unter Angabe der Zeilenhöhe entfernt, indem ich:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44.0;
}
Fantini
quelle
1

Wenn Sie eine benutzerdefinierte tableViewCell für tableView erstellt haben, stellen Sie sicher, dass Sie Ihren Zellen sowohl untere als auch obere Einschränkungen zugewiesen haben. Sie können diese Meldung auch erhalten, wenn Ihre Unteransichten in benutzerdefinierten Zellen in der Mitte Y ausgerichtet sind , wodurch keine Fehlermeldung angezeigt wird, sondern Probleme auftreten bis zur Identifizierung der Zeilenhöhe für die Tabellenansicht wir die wie in Bild I angegeben haben, haben wir hier sowohl die oberen als auch die unteren Einschränkungen

Wenn Sie eine benutzerdefinierte Zelle für tableView erstellen, müssen Sie bestimmte Zeilenhöhen- oder obere und untere Einschränkungen für die Unteransichten Ihrer benutzerdefinierten Zelle in der Zelle festlegen (z. B. Beschriftung in einer benutzerdefinierten Zelle wie im folgenden Bild).

Wenn dies jedoch nicht funktioniert, können Sie versuchen, die Zeilenhöhe für Ihre Zelle festzulegen, anstatt wie in diesem Bild automatisch zu arbeiten

Wenn Sie dieses automatische Häkchen deaktivieren, müssen Sie jedoch die Zeilengröße für Änderungen programmgesteuert anpassen, die automatisch hätten durchgeführt werden können

Monstergrube
quelle
0

Stellen Sie im Storyboard das cell Row heightFeld mit dem gleichen Wert wie Row heightin ein tableView(beide mit dem gleichen Wert arbeiteten für mich).

Wenn Sie heightForRowAtIndexPathIhrem Code eine Funktion hinzufügen, kann dies zu Leistungsproblemen führen, da diese für jede Zelle aufgerufen wird. Seien Sie also vorsichtig.

Daniel Gomez Rico
quelle
0

Möglicherweise wird diese Meldung auch angezeigt, wenn Ihre einzigen Einschränkungen so festgelegt sind, dass alle Elemente vertikal ausgerichtet werden und Sie keine Höhe für die Zelle angegeben haben / möchten. Wenn Sie eine obere / untere Einschränkung für das Element festlegen, wird die Warnung ausgeblendet.

Micah Montoya
quelle
0

Ich hatte dieses Problem, als meine Beschriftungen und Ansichten in der benutzerdefinierten tableViewCell auf die customCell und nicht auf deren Inhaltsansicht beschränkt waren. Als ich die Einschränkungen löschte und sie mit der Inhaltsansicht der Zellen verband, war das Problem gelöst.

Marija Zivkovic
quelle
0

Ich hatte die gleiche Fehlermeldung. Stellen Sie sicher, dass alle Ihre Steckdosen gültig sind, z. B. Einschränkungen für Tabellenansicht und Tabellenansicht

Gulz
quelle
0

Wenn Sie eine dynamische Höhenberechnung durchführen,

  • Sie sollten alle Elemente in Bezug auf Einschränkungen wie oben und unten miteinander verknüpft haben.
  • Sie sollten auf jeden Fall eine untere Einschränkung haben, die mit dem Element am unteren Rand Ihrer Zelle verknüpft ist
S. Mert
quelle
0

Ich habe auch ein ähnliches Problem für benutzerdefinierte Tabellenansichtszellen mit dynamischer Zeilenhöhe. Die dynamische Höhe wurde nicht reflektiert und erhielt dieselbe Warnung in der Konsole. Die Lösung besteht darin, der Zelle anstelle von contentView Unteransichten hinzuzufügen. Übrigens habe ich programmatisch Unteransichten erstellt.

Srinivas G.
quelle
0

Ich habe dieses Problem bei TableViewCells, bei denen die Einschränkungen für die Initialisierung festgelegt sind, der Inhalt der Zelle jedoch anschließend geladen wird. Dies bedeutet, dass die Autolayout-Engine die Höhe nicht bestimmen kann. Die anderen Lösungen hier funktionieren nicht, weil ich die Höhe der Zelle brauche UITableView.automaticDimension.

Ich habe der Zelle gerade eine zusätzliche Einschränkung hinzugefügt:

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)
Leon
quelle
0

Ich habe diese Warnung heute erhalten. Ich habe meinem Code nur eine zusätzliche Zeile hinzugefügt

tableView.rowHeight = 200;

Fügen Sie diese Codezeile in das Feld ein

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

und der endgültige Code sieht aus wie

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

Dieser Code erhöht die Zellenhöhe der Tabellenzeile auf 200, die Standardhöhe ist 44

SudhakarH
quelle
-1

Ich habe den gleichen Fehler, aufgrund dieser Zeile wurde dieser Fehler angezeigt.

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

Ich ändere einfach die Zeile wie folgt, um den Fehler zu beheben

self.layer.backgroundColor = UIColor (weiß: 1, alpha: 0,2) .cgColor

Malik Hassnain
quelle