8

Presets,dziwne przedmioty zanikające gdy przewija

mam collectionViewFlowLayout podklasę z

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { 
    return YES; 
    } 

- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect { 
    NSArray *arr = [super layoutAttributesForElementsInRect:rect]; 
    BBLog(@"ARRA:%@", arr); 
    for (UICollectionViewLayoutAttributes *attr in arr) { 
     if (CGAffineTransformIsIdentity(attr.transform)) { 
      attr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI); 
     } 
    } 

    return arr; 
} 

CollectionView góry obracają się w dół przewinąć z

self.collectionView.transform = CGAffineTransformMakeRotation((CGFloat)M_PI); 

Ale nawet jeśli jus używać ojczystego collectionViewFlowLayout bez podklasy, git ten błąd

Problem

Mam dwie wiadomości i więcej na czacie, ale po przewinięciu u dołu (u góry normalnie) znika drugi element.

layoutAttributesForElementsInRect dla podanych powrót rect dwóch atrybutów dla dwóch indexPaths 0-0 i 0-1, ale metoda delegat

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 

wywoływana tylko dla indexPath 0-0

Tutaj obrazów

TopScroll enter image description here

AKTUALIZACJA więc znalazłem Dlatego tak się stało - to kod linia

attr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI); 

Look jeśli usuń przekształcić

enter image description here

Odpowiedz

0

Niestety, wszystko, ale znalazłem przyczynę i obejść.

to zdarzyć tylko na urządzeniu nie na symulatorze

Spójrz na trzech CGRects

iPhone 5S

(CGRect) oldFrame = (origin = (x = -0.000000000000056843418860808015, y = 0), size = (width = 320.00000000000006, height = 314.00000000000006)) 

iPhone 5C

(CGRect) oldFrame = (pochodzenie = (x = 0, y = 0), rozmiar = (szerokość = 320, wysokość = 314))

Simulator Intel Core

(CGRect) oldFrame = (origin = (x = 0, y = 0), size = (width = 320, height = 314)) 

Do wszystkich z nich i zastosować obrót przekształcić poprzez

CGAffineTransformMakeRotation((CGFloat)M_PI) 

First To na iPhone 5S ARM firmy Apple A7 CPU

drugie to na iPhone 5C ARM Apple A6 CPU

Po trzecie na symulatorze procesora Intel Core iX.

Więc moja praca wokół jest:

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewLayoutAttributes *retAttr = [super layoutAttributesForItemAtIndexPath:indexPath]; 

    if (CGAffineTransformIsIdentity(retAttr.transform)) { 
     retAttr.transform = CGAffineTransformMakeRotation((CGFloat)M_PI); 
    } 

    CGRect oldFrame = retAttr.frame; 

    oldFrame.origin.x = retAttr.frame.origin.x > 0 ?: 0; 

    retAttr.frame = oldFrame; 

    return retAttr; 
} 
+0

jakieś rozwiązanie na szybkie? – DeyaEldeen

+1

W Swift nie testowałem, teraz kodowanie tylko w objc. Ale myślę, że ten sam problem będzie. –

1

nie jestem do końca pewien, ale myślę, że kiedy jesteś instacji UICollectionViewFlowLayout, nie mają modyfikować atrybuty bezpośrednio, ale zrobić kopię atrybutów, zmodyfikuj ją i zwróć.

Krótkie wyjaśnienie górnym stwierdzeniem: Trzeba będzie podklasy UICollectionViewFlowDelegate (rodzica UICollectionViewDelegateFlowLayout) i niż tworzyć własne atrybuty i modyfikować je jak chcesz, ale będzie to wymagało od wdrożyć dużo więcej niestandardowych logiki .

Sprawdź również, czy w konsoli pojawiają się błędy lub ostrzeżenia.

Sprawdź to pytanie: Warning: UICollectionViewFlowLayout has cached frame mismatch for index path 'abc'

nadzieję, że było przynajmniej trochę pomocny.