9

Zrobiłem podklasę collectionViewFlowLayout. Po tym, realizowany następujący kod:przy użyciu kolekcji podklasowejViewViewLayout Otrzymuję dziwny błąd

override func finalLayoutAttributesForDisappearingItemAtIndexPath(itemIndexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? { 
     let attr = self.layoutAttributesForItemAtIndexPath(itemIndexPath) 
     attr?.transform = CGAffineTransformRotate(CGAffineTransformMakeScale(0.8, 0.8), CGFloat(M_PI)) 
     attr?.center = CGPointMake(CGRectGetMidX(self.collectionView!.bounds), CGRectGetMidY(self.collectionView!.bounds)) 
     return attr 
    } 

Kiedy usuwać elementy w widoku kolekcji za pomocą performBatchUpdates: metodę debugger generuje ten komunikat o błędzie. Usunięcie faktycznie powiedzie się i działa w pełni, ale jestem nieco zdezorientowany tym wyjściem debuggera. Czy ktoś może mi wyjaśnić, czy powinienem zrobić to, aby debugger? Naprawdę nie rozumiem, jaki kod i gdzie należy dodać.

// BŁĘDZIE

2015-08-02 12:39:42.208 nameOfMyProject[1888:51831] Logging only once for UICollectionViewFlowLayout cache mismatched frame 2015-08-02 12:39:42.209 nameOfMyProject[1888:51831] UICollectionViewFlowLayout has cached frame mismatch for index path {length = 2, path = 0 - 11} - cached value: {{106.13333333333333, 131.13333333333333}, {75.733333333333348, 75.733333333333348}}; expected value: {{192.5, 288}, {94.666666666666671, 94.666666666666671}}

2015-08-02 12:39:42.209 nameOfMyProject[1888:51831] This is likely occurring because the flow layout subclass nameOfMyProject.ShopLayout is modifying attributes returned by UICollectionViewFlowLayout without copying them

2015-08-02 12:39:42.209 nameOfMyProject[1888:51831] Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

+0

Czy to tylko zacząć się dzieje z Xcode 7? Od czasu aktualizacji do Xcode 7 (i instalacji iOS9) działo się coś bardzo podobnego. Jestem Obj-C, nie jest szybki, ale błąd mówi, że nie kopiujesz atrybutów przed ich zmianą. Próbowałem zrobić coś takiego jak 'NSArray * allAttributesInArray = [[super layoutAttributesForElementsInRect: rect] copy];' przed manipulowaniem nimi, ale to też nie działa. – wanderingme

+0

Nigdy nie użyłem widoku kolekcji przed xcode 7. Skończyło się na używaniu zwykłego starego flowLayout bez podklasowania, więc naprawdę nie mogę dać odpowiedzi – brumbrum

+0

@wanderingMożesz się dowiedzieć, jak rozwiązać ten problem? Mam to samo i nic nie pomogło go jeszcze rozwiązać. – Solomiya

Odpowiedz

9

Błąd występuje, ponieważ jesteś manipulowania atrybutu bez kopiowania go w pierwszej kolejności. Tak to powinno rozwiązać błąd:

override func finalLayoutAttributesForDisappearingItemAtIndexPath(itemIndexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? { 
    let attr = self.layoutAttributesForItemAtIndexPath(itemIndexPath)?.copy() as! UICollectionViewLayoutAttributes 
    // manipulate the attr 
    return attr 
} 

Kiedy natkniesz się tego samego błędu w layoutAttributesForElementsInRect(rect: CGRect) trzeba kopiować każdego z elementów w tablicy, a nie tylko kopiowanie tablicy:

override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? { 
     let attributes = super.layoutAttributesForElementsInRect(rect) 
     var attributesCopy = [UICollectionViewLayoutAttributes]() 
     for itemAttributes in attributes! { 
      let itemAttributesCopy = itemAttributes.copy() as! UICollectionViewLayoutAttributes 
      // manipulate itemAttributesCopy 
      attributesCopy.append(itemAttributesCopy) 
     } 
     return attributesCopy 
    } 
+0

Kopiowanie wszystkich atrybutów w layoutAttributesForElementsInRect rozwiązało ostrzeżenia. –

+0

@Joern, to nie działa – Ranjit

+0

@Ranjit Czy miałeś okazję przyjrzeć się problemowi github wspomnianemu w komentarzach powyżej? (https://github.com/wtmoose/TLLayoutTransitioning/issues/26) – joern

Powiązane problemy