Die Anpassung der Position des Headers im UICollectionView-Layout führt zu NSInternalInconsistencyException-Fehlern

8

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:

  • Ich füge alle Header zu dem Array hinzu, das von layoutAttributesForElementsInRect zurückgegeben wird, so dass alle immer verarbeitet werden (dies kann die Ursache des Problems sein, da bin ich mir nicht sicher)
  • Ich aktualisiere dann jeden Header, indem ich einen festen Offset in 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 :

%Vor%

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%     
Ken Chatfield 15.01.2014, 00:45
quelle

5 Antworten

13
%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.

    
titaniumdecoy 28.04.2014 14:20
quelle
3

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

    
RndmTsk 23.07.2015 14:42
quelle
1

OK, ich bin mir nicht 100% ig sicher, warum, aber das Ersetzen von layoutAttributesForElementsInRect durch Folgendes scheint den Trick zu machen:

%Vor%

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.

    
Ken Chatfield 15.01.2014 12:02
quelle
0

Für mich kam dieses Problem wegen Sticky Header Layout vor, ich löste es mit PDKTStickySectionHeadersCollectionViewLayout

    
Aqib Mumtaz 05.10.2016 08:50
quelle
0

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.

    
Sudara 23.02.2018 00:18
quelle