Ich verwende Xcode 6 Beta 3, iOS 8 SDK. Erstellen Sie das Ziel iOS 7.0 mit Swift. Bitte beziehen Sie sich Schritt für Schritt auf mein Problem mit den folgenden Screenshots.
Ich habe eine UICollectionView im Storyboard. 1 Prototyp UICollectionViewCell, der 1 Label in der Mitte enthält (keine automatische Größenregel). Lila Hintergrund sollte eine Inhaltsansicht markieren, die zur Laufzeit von der Zelle generiert wird, denke ich. Die Größe dieser Ansicht wird basierend auf meinem UICollectionViewLayoutDelegate eventuell ordnungsgemäß geändert, jedoch nicht unter iOS 7. Beachten Sie, dass ich Xcode 6 verwende und das Problem nur unter iOS 7 auftritt.
Wenn ich die App auf iOS 8 baue. Alles ist in Ordnung.
Hinweis: Lila ist die Inhaltsansicht , Blau ist mein UIButton mit abgerundeter Ecke.
Unter iOS 7 schrumpfen jedoch alle Unteransichten in der Zelle plötzlich auf den Rahmen von (0,0,50,50) und entsprechen nie mehr meiner Autoresizing-Regel.
Ich nehme an, dies ist ein Fehler in iOS 8 SDK oder Swift oder vielleicht Xcode?
Update 1: Dieses Problem besteht weiterhin im offiziellen Xcode 6.0.1! Die beste Lösung ist die, die KoCMoHaBTa unten vorgeschlagen hat, indem der Frame in cellForItem der Zelle festgelegt wird (Sie müssen Ihre Zelle jedoch in Unterklassen unterteilen). Es stellte sich heraus, dass dies eine Inkompatibilität zwischen iOS 8 SDK und iOS 7 ist (siehe die unten von Apple zitierte Antwort von ecotax).
Update 2: Fügen Sie diesen Code am Anfang Ihres cellForItem ein und alles sollte in Ordnung sein:
/** Xcode 6 on iOS 7 hot fix **/
cell.contentView.frame = cell.bounds;
cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
/** End of Xcode 6 on iOS 7 hot fix **/
contentView
Größenänderung mit der Zelle zu erzwingen , funktioniert gut, um das Problem zu umgehen. Ich vermute, dass Apple in iOS 8 etwas an der Art und Weise geändert hat, wie Ansichten von Zelleninhalten behandelt werden, wenn sie in Interface Builder erstellt werden (was ohnehin immer noch eine Art Black Box ist). Aber die Tatsache, dass es das Verhalten beim Targeting von iOS 7 ändert, ist sicherlich ein Fehler.contentView
Kanten an die Zellenränder hefte.Antworten:
contentView ist kaputt. Es kann auch in awakeFromNib behoben werden
Objekt:
Swift3:
quelle
Ich bin auf dasselbe Problem gestoßen und habe Apple DTS um Hilfe gebeten. Ihre Antwort war:
Ich denke, dies bedeutet, dass es sich nicht um einen Fehler in XCode 6 handelt, sondern um eine Inkompatibilität zwischen dem iOS 8 SDK und dem iOS 7 SDK, die Sie beim Upgrade auf Xcode 6 treffen wird, da das iOS 8 SDK automatisch verwendet wird.
Wie ich bereits sagte, funktioniert die von Daniel Plamann beschriebene Problemumgehung für mich. Die von Igor Palaguta und KoCMoHaBTa beschriebenen sehen jedoch einfacher aus und scheinen sinnvoll zu sein, wenn man die Antwort von Apple DTS gibt. Deshalb werde ich sie später versuchen.
quelle
Ich bin auf dasselbe Problem gestoßen und hoffe, dass Apple dies mit der nächsten Xcode-Version beheben wird. In der Zwischenzeit verwende ich eine Problemumgehung. In meiner
UICollectionViewCell
Unterklasse habe ich geradelayoutSubviews
die Inhaltsansicht überschrieben und die Größe manuell geändert, falls die Größe von der Größe abweichtcollectionViewCell
.quelle
[cell layoutIfNeeded];
in cellForItem oder cellForRow zu platzieren?Eine andere Lösung besteht darin, die Größe und die automatische Größenanpassung von contentView
-collectionView:cellForItemAtIndexPath:
wie folgt festzulegen :Dies funktioniert auch mit dem automatischen Layout, da Masken mit automatischer Größenänderung in Einschränkungen übersetzt werden.
quelle
In Xcode 6.0.1 ist contentView für UICollectionViewCell für iOS7-Geräte fehlerhaft. Sie kann auch behoben werden, indem Sie UICollectionViewCell und dessen contentView in awakeFromNib- oder init-Methoden geeignete Einschränkungen hinzufügen.
quelle
Dies funktioniert ohne eine der anderen genannten Problemumgehungen aufgrund eines Fehlers in Xcode 6 GM bei der Kompilierung von XIB-Dateien im NIB-Format nicht ordnungsgemäß. Obwohl ich nicht mit 100% iger Sicherheit sagen kann, dass es sich um Xcode handelt und nichts mit Laufzeit zu tun hat, bin ich sehr zuversichtlich - so kann ich es zeigen:
Ich hoffe, jeder, der diese Frage liest, wird ein Radar bei Apple einreichen. Dies ist ein RIESIGES Problem und muss vor der endgültigen Veröffentlichung von Xcode behoben werden.
Bearbeiten: In Anbetracht des Beitrags von ecotax wollte ich dies nur aktualisieren, um zu sagen, dass es nun bestätigte Verhaltensunterschiede zwischen dem Erstellen in iOS 8 und iOS 7 gibt, aber kein Fehler. Mein Hack hat das Problem behoben, da auf der Grundlage von iOS 7 die Inhaltsmaske der Inhaltsansicht hinzugefügt wurde, die erforderlich ist, damit dies funktioniert, was Apple nicht mehr hinzufügt.
quelle
Die Antworten in diesem Beitrag funktionieren, was ich nie verstanden habe, ist warum es funktioniert.
Erstens gibt es zwei "Regeln":
[UIView new]
), wird die Eigenschaft auftranslatesAutoresizingMaskIntoConstraints
festgelegtYES
translatesAutoresizingMaskIntoConstraints
festgelegtNO
Die zweite Regel scheint nicht für Ansichten der obersten Ebene zu gelten, für die Sie keine Einschränkungen definieren. (Bsp. Die Inhaltsansicht)
Beachten Sie beim Betrachten einer Storyboard-Zelle, dass die Zelle nicht
contentView
freigelegt ist. Wir "kontrollieren" nicht diecontentView
, Apple ist.Tauchen Sie tief in den Storyboard-Quellcode ein und sehen Sie, wie die
contentView
Zelle definiert ist:<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
Nun die Unteransichten der Zelle (beachten Sie die
translatesAutoresizingMaskIntoConstraints="NO"
):<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="NaT-qJ-npL" userLabel="myCustomLabel">
Das
contentView
hat es nichttranslatesAutoresizingMaskIntoConstraints
eingestelltNO
. Außerdem fehlt die Layoutdefinition , möglicherweise aufgrund der Aussagen von @ecotax .Wenn wir uns das ansehen
contentView
, hat es eine Autoresizing-Maske, aber keine Definition dafür:<autoresizingMask key="autoresizingMask"/>
Es gibt also zwei Schlussfolgerungen:
contentView
translatesAutoresizingMaskIntoConstraints
ist auf eingestelltYES
.contentView
Es fehlt die Definition eines Layouts.Dies führt uns zu zwei Lösungen, über die gesprochen wurde.
Sie können die Autoresizing-Masken manuell einstellen in
awakeFromNib
:Oder Sie können das Set
contentView
translatesAutoresizingMaskIntoConstraints
zuNO
inawakeFromNib
und definieren Einschränkungen in- (void)updateConstraints
.quelle
Dies ist die Swift-Version von @ Igor's Antwort, die akzeptiert wird und danke für deinen netten Antwortkameraden.
Gehen Sie zuerst zu Ihrer
UICollectionViewCell
Unterklasse und fügen Sie den folgenden Code ein, wie er sich in der Klasse befindet.Ich benutze übrigens Xcode 7.3.1 und Swift 2.3. Die Lösung wurde unter iOS 9.3 getestet, das einwandfrei funktioniert.
Danke, hoffe das hat geholfen.
quelle
Fügen Sie in Swift den folgenden Code in die Unterklasse der Sammlungsansichtszelle ein:
quelle
Ich habe festgestellt, dass es auch Probleme mit der
contentView
Größenanpassung in iOS 8 gibt. Es wird in der Regel sehr spät im Zyklus angelegt, was zu vorübergehenden Einschränkungskonflikten führen kann. Um dies zu lösen, habe ich die folgende Methode in eine Kategorie von hinzugefügtUICollectionViewCell
:Diese Methode sollte nach dem Entfernen der Zelle aufgerufen werden.
quelle
dequeueReusableCellWithReuseIdentifier:forIndexPath:
.Ich habe das behoben:
siehe: hier
quelle
Stellen Sie einfach sicher, dass Sie das Kontrollkästchen "Autoresize-Unteransichten" in der Schreibfeder für diese Sammlungsansichtszelle aktivieren. Es funktioniert sowohl unter iOS 8 als auch unter iOS 7.
quelle