Ich versuche, die Positionen der Header in einem UICollectionView
mit einer Unterklasse UICollectionViewFlowLayout
anzupassen (basierend auf dem Code für gestapelte Header, der gezeigt wird Linkbeschreibung hier eingeben ).
Als minimaler Test möchte ich nur einen festen Offset zur Position aller Header hinzufügen:
layoutAttributesForElementsInRect
zurückgegeben wird, so dass alle immer verarbeitet werden (dies kann die Ursache des Problems sein, da bin ich mir nicht sicher) layoutAttributesForSupplementaryViewOfKind
hinzufüge
Die vollständige Implementierung ist am Ende dieses Beitrags enthalten.
(Übrigens, ich weiß, dass das Hinzufügen aller Header, einschließlich derjenigen außerhalb des Rect, im ersten Schritt streng genommen nicht notwendig ist, aber dies ist ein vereinfachtes Beispiel für eine komplexere Anpassung in der Position, die ich machen möchte verursachen Sie, dass alle Überschriften in dem Zeichenrect angezeigt werden.)
Wenn ich jedoch den Code ausführe, erhalte ich folgende NSInternalInconsistencyException
:
Es scheint, dass dies durch die Aktualisierung der Attribute verursacht wird, so als ob ich die folgenden zwei Zeilen auskommentiere, funktioniert es gut:
%Vor%Was verursacht diesen Fehler und was kann ich tun, um mein einfaches Beispiel zum Laufen zu bringen?
Hier ist die vollständige Klassenimplementierung für dieses einfache Beispiel:
%Vor% Nach meiner Erfahrung wird das NSInternalInconsistencyException
mit der obigen Beschreibung ausgelöst, wenn das von layoutAttributesForElementsInRect:
zurückgegebene Array zwei UICollectionViewLayoutAttributes
-Objekte mit dem gleichen Indexpfad und (zusätzlichen) Elementkategorien enthält.
Sie erhalten diesen Fehler, weil Sie frame
von (0 0; 320 50)
auf (0 50; 320 50)
anpassen, ohne das Layout erneut zu überprüfen (wahrscheinlich geschieht dies versehentlich).
Dies liegt in der Regel daran, dass Sie für zwei verschiedene Layoutelemente dieselbe IndexPath
referenzieren, aber für jede einen anderen frame
-Wert bereitstellen.
Betrachten Sie Folgendes:
%Vor% Jeder benutzt das gleiche IndexPath
und verursacht somit NSInternalInconsistencyException
OK, ich bin mir nicht 100% ig sicher, warum, aber das Ersetzen von layoutAttributesForElementsInRect
durch Folgendes scheint den Trick zu machen:
Ich kann mir nur vorstellen, dass bevor layoutAttributesForElementsInRect
früh aufgerufen wurde, bevor die Kopfzeile, die ich dem Steuerelement für den ersten Abschnitt hinzugefügt hatte, richtig initialisiert wurde, und so programmatisch zu bestimmen, welche Header vorhanden waren. Irgendwelche Gedanken wären willkommen, aber mit dem Obigen ist das Problem gelöst.
Für mich kam dieses Problem wegen Sticky Header Layout vor, ich löste es mit PDKTStickySectionHeadersCollectionViewLayout
Das ist mir passiert, wenn sectionHeadersPinToVisibleBounds
auf "true" gesetzt wurde.
Durch Überschreiben und Übergeben von true
in func shouldInvalidateLayout(forBoundsChange: CGRect)
wurde es korrigiert. Ich bin mir jedoch nicht sicher, welche anderen Nebenwirkungen diese Lösung mit sich bringen würde.
Tags und Links ios uicollectionview ios7 uicollectionviewlayout