2013-04-09 3 views
6

Trovato questo strano comportamento durante l'implementazione di una sottoclasse personalizzata UICollectionViewLayout. Ho impostato i metodi della sottoclasse eccetto per collectionViewContentSize. Tutte le celle si sono mostrate dove mi aspettavo, ma il contentView era troppo lungo. Sembrava essere il doppio di quello che dovrebbe essere.UICollectionViewLayout prepareLayout viene chiamato per qualsiasi scorrimento

Ho implementato il metodo seguente per ottenere il valore corretto contentSize. Tuttavia, è ora il valore previsto, prepareLayout viene chiamato ogni volta che la vista scorre un pixel. Ciò significa che se si scorre da 0,0 a 0,500, prepareLayout viene chiamato 500 volte!

Che cos'è il mio collectionViewContentSize che potrebbe causare quello?

- (CGSize)collectionViewContentSize { 
    UICollectionViewLayoutAttributes *leftAttributes = (UICollectionViewLayoutAttributes *)self.layoutInfo[@"segmentCell"][[NSIndexPath indexPathForItem:[self.collectionView numberOfItemsInSection:0]-1 inSection:0]]; 
    UICollectionViewLayoutAttributes *rightAttributes = (UICollectionViewLayoutAttributes *)self.layoutInfo[@"segmentCell"][[NSIndexPath indexPathForItem:[self.collectionView numberOfItemsInSection:1]-1 inSection:1]]; 
    float leftHeight = leftAttributes.frame.size.height + leftAttributes.frame.origin.y; 
    float rightHeight = rightAttributes.frame.size.height + rightAttributes.frame.origin.y; 
    float maxHeight = leftHeight > rightHeight ? leftHeight : rightHeight; 
    return CGSizeMake(self.collectionView.bounds.size.width, maxHeight); 
} 
+0

Stai attuazione: __ da __YES__ ritorno? –

+0

No, non l'ho ancora implementato. – brodney

risposta

6

Anche se secondo la documentazione si suppone [0] shoulInvalidateLayoutForBoundsChange: per tornare NO per impostazione predefinita, non lo era. Una volta implementato e restituito NO in tutti i casi, prepareLayout non viene più chiamato con ogni modifica dei limiti. Sembra un bug in UICollectionViewLayout.

[0] http://developer.apple.com/library/ios/#documentation/uikit/reference/UICollectionViewLayout_class/Reference/Reference.html __shouldInvalidateLayoutForBoundsChange