2016-09-05 3 views
0

Ich versuche, eine UITableViewCell mit einem einzigen UIImageView in einem UITableView mit dynamischen Zellenhöhen mit AutoLayout (d. H. tableView.rowHeight = UITableViewAutomaticDimension) zu platzieren.Single UIImageView in UITableViewCell mit Autolayout

Die Bilder, die ich anzeigen werde, haben ein bestimmtes Verhältnis (1000: 667), aber neben den Bildzellen gibt es noch andere Zellen. Ich habe meine Beschränkungslogik für diese Zelle so aufgebaut, dass sie das Seitenverhältnis des UIImageView berücksichtigt.

Um Missbildungen oder Teile des Bildes, die nicht angezeigt werden (Clip-Unteransichten), zu vermeiden, sollte daher die Abhängigkeit des Seitenverhältnisses die Höhe der Zelle abhängig von der Bildschirmbreite des Geräts bestimmen.

Die Zelle wurde in einer Nib-Datei mit den folgenden Einschränkungen gebaut:

IB constraints

Offenbar das funktioniert, da die Höhe der Zelle Laufzeit je nach Gerät (Simulator) verwendete entsprechend auf eingestellt ist.

Das Problem ist, ich bekomme viele Breaking Constraint Fehlerprotokolle (unten). Irgendwelche Ideen, warum iOS/die Tabelle Beschwerden über diese Einschränkungen anzeigen?

Vorschläge zu verschiedenen Ansätzen zur Anzeige einer UITableViewCell, die das Seitenverhältnis respektiert, würden ebenfalls geschätzt werden.

Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x7ff5097a7910 UIImageView:0x7ff5097393a0.width == 1.49925*UIImageView:0x7ff5097393a0.height>", 
    "<NSLayoutConstraint:0x7ff509739550 V:|-(0)-[UIImageView:0x7ff5097393a0] (Names: '|':UITableViewCellContentView:0x7ff5097a8e10)>", 
    "<NSLayoutConstraint:0x7ff5097aa180 UIImageView:0x7ff5097393a0.centerY == UITableViewCellContentView:0x7ff5097a8e10.centerY>", 
    "<NSLayoutConstraint:0x7ff5097a8c70 H:|-(0)-[UIImageView:0x7ff5097393a0] (Names: '|':UITableViewCellContentView:0x7ff5097a8e10)>", 
    "<NSLayoutConstraint:0x7ff5097a8cc0 H:[UIImageView:0x7ff5097393a0]-(0)-| (Names: '|':UITableViewCellContentView:0x7ff5097a8e10)>", 
    "<NSLayoutConstraint:0x7ff5097b6440 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7ff5097a8e10(276)]>", 
    "<NSLayoutConstraint:0x7ff5097b4930 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x7ff5097a8e10(414)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7ff5097a7910 UIImageView:0x7ff5097393a0.width == 1.49925*UIImageView:0x7ff5097393a0.height> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
+0

ich auch andere Einschränkung versucht haben annähert, wie Ersetzen des 'Zentriert Y: Superview' für' Equal Breite zu: SuperView' mit dem gleichen Ergebnis. – Fdo

+0

Wenn Sie möchten, dass UIImageView height festgelegt wird, dann gilt nur die obere oder untere Einschränkung. Auch wenn Sie Ausrichtung und Höhe in der Mitte haben, brauchen Sie keine obere und untere Beschränkung. Wenn Sie möchten, dass die UIImageView-Breite festgelegt wird, müssen Sie eine führende oder nachgestellte Einschränkung verwenden. – sschunara

+0

Entfernen Sie einfach die feste Höhe und Breite von imageView sowie die Mittenausrichtung. wird dieses Problem beheben. –

Antwort

4

Diese eine Ursache hat unnötige automatische Layouts (Höhe, Breite und Mitte y) ergeben.

z. Sie gab Höhe dann oben und unten, Höhe noch festgelegt ist hat man oben und unten Ausrichtung ... das ist nicht notwendig ...

enter image description here

Sie diese Vorschläge ausprobieren können.

1)center y + Trailing + Leading + Height. 2)Top + Bottom + Trailing + Leading. 3)height + width + center y + Leading und viele mehr

Ich hoffe, Sie verstehen ...

0

Für Auto-Layout jede Ansicht, nur die Dinge, die erfüllt sein müssen, sind alle Ansichten sollten Breite, Höhe, und X-und Y-Positionen erhalten.

Jetzt aus Ihrer Frage, es sieht aus, dass von 6 Einschränkungen, die Sie zur Verfügung gestellt, nur die letzten 4 Konstanten sind autark, um die Anforderungen zu erfüllen, so erstens 2 Einschränkungen sind nicht erforderlich. Entferne sie einfach. Alle Dinge werden gut.

Die Warnmeldungen, die Sie sehen, sind auf mehr als zwei Einschränkungen zurückzuführen, die Sie durcheinander gebracht haben.

1

Fdo, die Protokolle, die Sie deutlich gebucht haben erklärt, was schief läuft es in :)

Was ist das Problem?

  1. Sie haben das Seitenverhältnis auf imageView eingestellt. Daher versucht imageView, die Größe des Bildes zu ändern, während das von Ihnen angegebene Seitenverhältnis beibehalten wird. Die Höhe und Breite von ImageView kann/kann daher je nach dem von Ihnen zugewiesenen Bild variieren.

  2. Sie haben die Einschränkung für führende Zeilenumbrüche von imageView auf die contentView der Zelle angewendet. Das bedeutet, dass die Bildansicht die gesamte Breite der Zelle abdecken soll. Sie befinden sich in Konflikt mit Ihrer eigenen Einschränkung. Direkt über Ihnen gesagt, imageView ist frei, um seinen Rahmen jetzt ändern Sie sagen, es sollte ganze Breite der Zelle abdecken, wie ist das überhaupt möglich Kumpel?

  3. In ähnlicher Weise haben Sie die obere und untere Einschränkung der Bildansicht auf die contentView der Zelle angewendet. Warum bricht das dann nicht? Einfach, da die Zellenhöhe dynamisch anhand des Bildes berechnet wird, das Sie an imageView übergeben. Offensichtlich entspricht die Größe der Bildansicht nach der Größenänderung der Höhe der Zelle. Also kein Problem mit der Zellenhöhe.

Wie lösen?

  1. einfaches Entfernen hintere und vordere Raum Einschränkung für Imageview zu Zelle content und stattdessen horizontal Zentrum Einschränkung für Imageview anwenden, die imageViews X-Position als auch und wird nicht Verwirrung mit der Breite von Imageview geben. Daher keine Einschränkungen Pausen und alles wird wie Charme arbeiten

Extra-Ratschlag

Wenn Sie angegeben haben, dass Imageview Seiten oben und unten Einschränkung Zellen haben, was bedeutet, dass Imageview Höhe immer sein wird, Wie hoch ist die Höhe der Zelle, macht es ernsthaft Sinn zu sagen, dass imageView im vertikalen Zentrum der Zelle sein wird? Denn sowieso wird Ihr ImageView die gesamte Zelle von oben nach unten abdecken. Es ist nicht das Beste, etwas zu tun, sondern Einschränkungen zu überschreiten, als das, was tatsächlich benötigt wird, da dies in Zukunft zu anderen Konsequenzen führen könnte.

Ich hoffe, es hilft.

Verwandte Themen