wake-up-neo.com

Es wurde ein Fall entdeckt, bei dem Einschränkungen eindeutig eine Höhe von Null vorschlagen

Nach dem Update auf Xcode 6.1 Beta 2, wenn ich meine App mit Tabellenzellen ausführen, 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.

Wenn ich bei diesem Projekt Xcode 5 verwendet habe, würde ich ein paar Fehler erhalten, die jedoch seit dem Upgrade verschwunden sind. Ich habe jetzt keine weiteren Fehler oder Warnungen. Ich habe bereits versucht, die Größe aller Tableview-Zellen anzupassen und auch die Standardhöhe zu verwenden, aber ich bekomme 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 durchgelesen, aber keine ihrer Lösungen hilft. Wenn ich die App mit dem Simulator teste, läuft die App einwandfrei, mit Ausnahme der Bilder, die in den tableView-Zellen enthalten sein sollen.

90
David E

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

  • So legen Sie die Höhe der Standardzelle in viewDidLoad fest

    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 Delegatenmethode heightForRowAtIndexPath von tableview

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

Seltsam.

95
Viktor Kucera

Sie stoßen auf den Nebeneffekt einer fantastischen neuen Funktion in den Tableviews von iOS8: Automatic Row Heights. 

In iOS 7 hatten Sie entweder Zeilen mit fester Größe (mit tableView.rowHeight festgelegt), oder Sie schreiben Code, um die Höhe Ihrer Zellen zu berechnen, und geben Sie diesen in tableView:heightForRowAtIndexPath zurück. Das Schreiben von Code für die Berechnung der Höhe einer Zelle könnte ziemlich komplex sein, wenn Sie in Ihrer Zelle zahlreiche Ansichten hatten und unterschiedliche Höhen bei unterschiedlichen Schriftgrößen zu berücksichtigen hatten. Add in Dynamic Type und der Prozess war ein Ärgernis.

In iOS 8 können Sie immer noch das oben beschriebene tun, aber jetzt kann die Höhe der Zeilen von iOS bestimmt werden, vorausgesetzt, Sie haben den Inhalt Ihrer Zelle mit Auto Layout konfiguriert. Dies ist ein großer Vorteil für Entwickler, da sich die dynamische Schriftgröße ändert oder der Benutzer die Textgröße mithilfe der Einstellungen für Barrierefreiheit ändert, und Ihre Benutzeroberfläche kann sich an die neue Größe anpassen. Das bedeutet auch, wenn Sie ein UILabel mit mehreren Textzeilen haben. Ihre Zelle kann sich jetzt an die Anzahl der Zellen anpassen, wenn dies erforderlich ist, und schrumpft, wenn dies nicht der Fall ist, sodass kein unnötiger Leerraum entsteht. 

Die 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 auch diese Nachricht loswerden wird, müssen Sie sicherstellen, dass Ihre Zelle über ausreichende Einschränkungen verfügt, um die Elemente der Benutzeroberfläche an das obere und das untere von zu binden die Zelle. Wenn Sie Auto-Layout bereits verwendet haben, sind Sie wahrscheinlich daran gewöhnt, Top + Leading-Einschränkungen festzulegen. Die dynamische Zeilenhöhe erfordert jedoch auch untere Einschränkungen. 

Der Layout-Durchlauf funktioniert auf diese Weise, der unmittelbar vor dem Anzeigen einer Zelle auf dem Bildschirm in einer Just-in-Time-Weise erfolgt:

  1. Bemaßungen für Inhalte mit intrinsischen Größen werden berechnet. Dazu gehören UILabels und UIImageViews, deren Dimensionen auf dem jeweils enthaltenen Text bzw. den darin enthaltenen UIImages basieren. Beide Ansichten betrachten ihre Breite als bekannt (weil Sie Einschränkungen für nachlaufende/führende Kanten festgelegt haben oder explizite Breiten festlegen oder horizontale Beschränkungen verwendet haben, die schließlich eine Breite von Seite zu Seite ergeben). Angenommen, ein Etikett enthält einen Textabschnitt ("Zeilenanzahl" ist auf 0 gesetzt, damit es automatisch umgebrochen wird). Es kann nur 310 Punkte groß sein und ist daher bei der aktuellen Schriftgröße auf 120 pt hoch. 

  2. Die Benutzeroberfläche wird entsprechend Ihren Positionierungseinschränkungen gestaltet. Am unteren Rand der Beschriftung befindet sich eine Einschränkung, die mit dem unteren Rand der Zelle verbunden ist. Da das Label 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 (um die Höhe der Zelle zu erhöhen), um die Einschränkung zu erfüllen, die "bottom of" sagt Die Beschriftung hat immer den Standardabstand vom unteren Rand der Zelle. 

Die Fehlermeldung, die Sie gemeldet haben, wird angezeigt, wenn die untere Einschränkung fehlt. In diesem Fall gibt es nichts, was den unteren Rand der Zelle vom oberen Rand der Zelle "schiebt". Dies ist die Mehrdeutigkeit, die gemeldet wird: ohne den unteren Rand Oben bricht die Zelle zusammen. Auto Layout erkennt dies aber auch und verwendet die Standardzeilenhöhe. 

Für das, was es wert ist, und vor allem eine runde Antwort zu haben, sollten Sie, wenn Sie die automatischen Layout-basierten dynamischen Zeilenhöhen von iOS 8 implementieren, tableView:estimatedHeightForRowAtIndexPath: implementieren. Diese Schätzmethode kann grobe Werte für Ihre Zellen verwenden. Sie wird beim ersten Laden der Tabellenansicht aufgerufen. Dies hilft UIKit beim Zeichnen von Dingen wie der Bildlaufleiste, die nicht gezeichnet werden kann, wenn der TableView nicht weiß, wie viel Inhalt durchlaufen werden kann. Es ist jedoch keine absolut genaue Größe erforderlich, da es sich lediglich um eine Bildlaufleiste handelt. Dadurch kann die Berechnung der tatsächlichen Zeilenhöhe bis zu dem Moment verschoben werden, in dem die Zelle benötigt wird. Dies ist weniger rechenintensiv und ermöglicht eine schnellere Darstellung Ihres UITableView. 

177
Woodster

Ich hatte dieses Problem, nachdem ich ein benutzerdefiniertes UITableViewCell erstellt und meine Unteransichten zur Zelle hinzugefügt hatte, anstatt dessen contentView

9
ABakerSmith

Um dies ohne programmatische Methode zu beheben, passen Sie die Zeilenhöhe der Tabellenansicht im Größeninspektor über das Storyboard an.

enter image description here

8
Anconia

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

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

Ich musste keine Änderungen am Code vornehmen

4
humblePilgrim

Aktivieren Sie einfach selbstzuschreibende Tabellenzellen

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

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

 enter image description here

3
Jack

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

3
Alok

Wenn Sie eine statische Zelle oder eine dynamische Zelle verwenden, fügen Sie der Tabellenansicht in der Inspektortabelle einfach eine Zeilenhöhe hinzu, und deaktivieren Sie die automatische Einstellung auf der rechten Seite der Zeilenhöhe. Andernfalls wird diese Warnung nicht mehr angezeigt . enter image description here

2
Amit Verma

In xcode 6.0.1 hatte ich diese Warnungen mit der Angabe der Zeilenhöhe entfernt:

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

In meinem Fall baute ich die Zelle programmgesteuert auf und erhielt diesen Fehler immer wieder.

Ich habe die Subviews und Einschränkungen in der UITableViewCell-Methode von init wie folgt hinzugefügt:

addSubview(rankingLabel)
addConstraints(cellConstraints)

Ich löste das Problem, indem ich sie stattdessen der contentView der Zelle hinzufügte:

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)
1
gohnjanotis

Diese Warnung habe ich auch mit dem Umstieg auf Xcode 6 GM erlebt. Ich erhielt die Warnung nur, als ich das Gerät in seine ursprüngliche Position zurückdrehte.

Ich verwende benutzerdefinierte UITableViewCells. Die Storyboard-Tabellenansicht wird auf meine benutzerdefinierte Größe (in meinem Fall 100.0) festgelegt. Während die Tabellenzellen wie in früheren Releases ordnungsgemäß dargestellt werden, hat mir die Warnmeldung nicht gefallen.

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

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

Bildschirmrendern ... reagiert auf Rotation und keine Warnmeldungen mehr.

1
DannyJi

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

enter image description here

1
TruMan1

Wenn Sie eine benutzerdefinierte tableViewCell für tableView erstellt haben, vergewissern Sie sich, dass Sie den Zellen sowohl die untere als auch die obere Einschränkung zugewiesen haben. Diese Meldung kann auch angezeigt werden, wenn Ihre Unteransichten in benutzerdefinierten Zellen in der Mitte Y ausgerichtet sind , das keine Fehlermeldung aufwirft, aber die Höhe der Zeile für die Tabellenansicht in Frage stellt wie in dem Bild, das ich angehängt habe, haben wir hier sowohl obere als auch untere Einschränkungen

Wenn Sie eine benutzerdefinierte Zelle für tableView erstellen, müssen Sie eine bestimmte Zeilenhöhe oder Ober- und Untergrenze für die Unteransichten Ihrer benutzerdefinierten Zelle in der Zelle festlegen (z. B. Beschriftung in der benutzerdefinierten Zelle wie in der Abbildung unten).

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

Wenn Sie dieses automatische Häkchen deaktivieren, müssen Sie jedoch die Zeilengröße anpassen, um programmgesteuert Änderungen vorzunehmen, die möglicherweise automatisch vorgenommen wurden

1
monster pit

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

0
Micah Montoya

Legen Sie im Storyboard das Feld cellRow height mit demselben Wert wie Row height in tableView fest (beide mit demselben Wert, das für mich gearbeitet hat).

Wenn Sie Ihrem Code eine heightForRowAtIndexPath-Funktion hinzufügen, kann dies zu einem Leistungsproblem führen, da dies für jede Zelle aufgerufen wird. Seien Sie also vorsichtig.

0
Caipivara

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

0
Marija Zivkovic

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

0
Malik Hassnain

Ich hatte die gleiche Fehlermeldung. Stellen Sie sicher, dass alle Ihre Ausgänge gültig sind, wie zum Beispiel Table View und TableView Constraints

0
Gulz