Ich verwende programmgesteuert automatische Layoutbeschränkungen, um meine benutzerdefinierten UITableView-Zellen zu gestalten, und definiere die Zellengrößen in korrekt tableView:heightForRowAtIndexPath:
Es funktioniert ganz gut auf iOS6 und es tut Blick fein in iOS7 auch
ABER wenn ich die App unter iOS7 starte, ist hier die Art von Nachricht, die ich in der Konsole sehe:
Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2013-10-02 09:56:44.847 Vente-Exclusive[76306:a0b] 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. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0xac4c5f0 V:|-(15)-[UIImageView:0xac47f50] (Names: '|':UITableViewCellContentView:0xd93e850 )>",
"<NSLayoutConstraint:0xac43620 V:[UIImageView:0xac47f50(62)]>",
"<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>",
"<NSLayoutConstraint:0xac43680 V:[UIView:0xac4d0f0(1)]>",
"<NSLayoutConstraint:0xac436b0 V:[UIView:0xac4d0f0]-(0)-| (Names: '|':UITableViewCellContentView:0xd93e850 )>",
"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xac43650 V:[UIImageView:0xac47f50]-(>=0)-[UIView:0xac4d0f0]>
Und tatsächlich gibt es eine der Einschränkungen in dieser Liste, die ich nicht möchte:
"<NSAutoresizingMaskLayoutConstraint:0xac6b120 h=--& v=--& V:[UITableViewCellContentView:0xd93e850(44)]>"
und ich kann die translatesAutoresizingMaskIntoConstraints
Eigenschaft von nicht contentView
auf NO setzen => es würde die gesamte Zelle durcheinander bringen.
44 ist die Standardzellenhöhe, aber ich habe meine benutzerdefinierten Höhen im Tabellenansicht-Delegaten definiert. Warum hat die Zelleninhaltsansicht diese Einschränkung? Was könnte das verursachen?
In iOS6 passiert das nicht und sowohl auf iOS6 als auch auf iOS7 sieht alles gut aus.
Mein Code ist ziemlich groß, daher werde ich ihn nicht hier veröffentlichen, aber Sie können jederzeit nach einem Pastebin fragen, wenn Sie ihn benötigen.
Um anzugeben, wie ich es bei der Zellinitialisierung mache:
- Ich erstelle alle meine Beschriftungen, Schaltflächen usw.
- Ich habe ihr
translatesAutoresizingMaskIntoConstraints
Eigentum auf NEIN gesetzt - Ich füge sie als Unteransichten
contentView
der Zelle hinzu - Ich füge die Einschränkungen für die
contentView
Ich bin auch sehr daran interessiert zu verstehen, warum dies nur unter iOS7 geschieht.
Antworten:
Ich hatte auch dieses Problem. Es scheint, dass der Frame von contentView erst aktualisiert wird, wenn er
layoutSubviews
aufgerufen wird. Der Frame der Zelle wird jedoch früher aktualisiert, sodass der Frame von contentView{0, 0, 320, 44}
zum Zeitpunkt der Auswertung der Einschränkungen festgelegt bleibt .Nach eingehenderer Betrachtung der Inhaltsansicht scheint es, dass keine automatischen Größenmasken mehr festgelegt werden.
Das Festlegen der autoresizingMask, bevor Sie Ihre Ansichten einschränken, kann dieses Problem beheben:
quelle
self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
bevor Sie Ihre Einschränkungen hinzufügen, um das Problem zu beheben.self.contentView.bounds = CGRectMake(0, 0, 99999, 99999);
genauso gut funktioniert wie die Verwendungself.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
. Ich habe dies eingefügt,updateConstraints
bevor ich die Einschränkungen zu meiner Inhaltsansicht hinzufüge.Anscheinend stimmt etwas mit UITableViewCell und UICollectionViewCell unter iOS 7 mit iOS 8 SDK nicht.
Sie können die Inhaltsansicht der Zelle aktualisieren, wenn die Zelle wie folgt wiederverwendet wird:
Für statischen UITableViewController:
Da Static Table View Controller fragil sind und leicht beschädigt werden können, wenn Sie Datenquellen- oder Deletegate-Methoden implementieren, gibt es Überprüfungen, die sicherstellen, dass dieser Code nur unter iOS 7 kompiliert und ausgeführt wird
Ähnlich verhält es sich mit dem dynamischen Standard-UITableViewController:
In diesem Fall benötigen wir keine zusätzliche Überprüfung der Kompilierung, da die Implementierung dieser Methode erforderlich ist.
Die Idee ist für beide Fälle und für UICollectionViewCell gleich, wie in diesem Thread kommentiert: Die automatische Größenänderung des Frames von UICollectionViewCell contentView in der Storyboard-Prototypzelle (Xcode 6, iOS 8 SDK) tritt nur unter iOS 7 auf
quelle
Da Zellen wiederverwendet werden und sich die Höhe je nach Inhalt ändern kann, ist es meiner Meinung nach im Allgemeinen besser, die Priorität von Abständen auf weniger als erforderlich festzulegen.
In Ihrem Fall hat die UIImageView einen Abstand von 15 nach oben und die untere Ansicht einen Abstand von 0 nach unten. Wenn Sie die Priorität dieser Einschränkungen auf 999 (anstelle von 1000) festlegen, stürzt die App nicht ab, da die Einschränkungen nicht erforderlich sind.
Sobald die layoutSubviews-Methode aufgerufen wird, hat die Zelle die richtige Höhe und die Einschränkungen können normal erfüllt werden.
quelle
Ich habe immer noch keine gute Lösung für Storyboards gefunden ... Einige Informationen auch hier: https://github.com/Alex311/TableCellWithAutoLayout/commit/bde387b27e33605eeac3465475d2f2ff9775f163#commitcomment-4633188
Nach dem, was sie dort raten:
Ich habe meine Lösung induziert:
.
.
quelle
Erhöhen Sie einfach die Standardzellenhöhe. Es sieht so aus, als ob das Problem darin besteht, dass der Inhalt der Zelle größer als die Standardgröße (anfänglich) ist und einige Nicht-Negativitätsbeschränkungen verletzt, bis die Größe der Zelle auf ihre tatsächliche Größe geändert wird.
quelle
UITableViewCellScrollView
Bildlaufansicht (vom Typ ) zwischen der Tabellenansichtszelle und der Inhaltsansicht. das erklärt wahrscheinlich den Unterschied zwischen iOS 6 und 7 hier.Stellen Sie möglicherweise die Priorität der Ansicht auf mehr als 750 und weniger als 1000 ein.
quelle
Ich hatte das gleiche Problem. Meine Lösung basiert auf anderen oben:
Am besten, Alessandro
quelle
You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.
Ich habe mich auch diesem Problem gestellt und keiner der Vorschläge hat geholfen. In meinem Fall hatte ich eine Größenauswahlzelle, die eine CollectionView enthielt (jede CollectionView-Zelle enthielt ein Bild in voller Größe). Jetzt war die Zellengröße etwas größer (60) als die Sammlungsansicht (50) und die darin enthaltenen Bilder (50). Aus diesem Grund hat die collectionView-Ansicht die Ausrichtung unten an der Superview-Einschränkung mit einem Wert von 10. In diesem Fall war ich eine Warnung, und die einzige Möglichkeit, dies zu beheben, bestand darin, die Zellenhöhe mit der collectionView gleichzusetzen.
quelle
Am Ende habe ich UITableViewCell im Designer überhaupt nicht verwendet ... Ich erstelle dort eine benutzerdefinierte Ansicht und füge sie programmgesteuert zur Inhaltsansicht der Zelle hinzu ... Mit einigen Hilfekategorien gibt es auch kein Code-Boilerplate ...
quelle
Wenn es in iOS8 einwandfrei funktioniert und die Warnung in iOS7 angezeigt wird, können Sie den Storyboard-Quellcode durchsuchen, die richtige tableviewCell finden und dann das rect-Attribut nach der tableviewCell-Zeile anhängen. Danke an Kuchumovn .
quelle