8

Presets,elementi a scomparsa strano quando scorre

ho collectionViewFlowLayout sottoclasse con

- (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 ruotare a testa in giù scorrere con

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

Ma anche se jus utilizzano collectionViewFlowLayout nativo senza la creazione di sottoclassi, a git questo errore

Problema

Ho due messaggi e altro in chat, ma quando si scorre in basso (in alto normalmente) scompare il secondo elemento.

layoutAttributesForElementsInRect per determinati ritorno rect due attributi per due indexPaths 0-0 e 0-1, ma metodo delegato

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

chiamato solo per indexPath 0-0

Qui immagini

TopScroll enter image description here

AGGIORNAMENTO così ho trovato questo che è accaduto - questo codice di linea

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

un'occhiata se rimuovere trasformare

enter image description here

risposta

0

Siamo spiacenti, tutti, ma ho trovato la ragione e aggirare.

Questo avviene solo sul dispositivo non sul simulatore

sguardo a tre CGRects

iPhone 5S

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

iPhone 5C

(CGRect) oldFrame = (origine = (x = 0, y = 0), dimensione = (larghezza = 320, altezza = 314))

Simulator Intel Core

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

A tutti loro applico rotazione trasformare via

CGAffineTransformMakeRotation((CGFloat)M_PI) 

In primo luogo è su iPhone 5S ARM Apple A7 CPU

In secondo luogo è su iPhone 5C ARM Apple A6 CPU

In terzo luogo è su Simulator al processore Intel Core iX.

Quindi, il mio lavoro intorno è:

- (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

qualsiasi soluzione per swift? – DeyaEldeen

+1

In swift non ha testato, ora codifica solo in objc. Ma penso che lo stesso problema sarà. –

1

io non sono del tutto sicuro, ma penso che, quando siete sottoclasse l'UICollectionViewFlowLayout, Non sono tenuti per modificare direttamente gli attributi, ma per fare un copia degli attributi, modificalo e restituiscilo.

Breve spiegazione della dichiarazione top: Si dovrà creare una sottoclasse del UICollectionViewFlowDelegate (il genitore di UICollectionViewDelegateFlowLayout) e di rendere i propri attributi e modificarli come vuoi, ma questo richiederà di implementare molto logica più personalizzato .

Verificare inoltre se si verificano errori o avvisi nella console.

Partenza a questa domanda: Warning: UICollectionViewFlowLayout has cached frame mismatch for index path 'abc'

speranza che ero almeno un po 'utile.