ios - columns - ¿EstimatedItemSize de UICollectionViewFlowLayout rompe el desplazamiento?
uicollectionview programmatically swift (2)
( EDITAR : parece estar funcionando bien comenzando con iOS 9. No realicé pruebas exhaustivas, pero el ejemplo funciona. Esto confirma el error presente en iOS 8.)
Pasé mucho tiempo probando el comportamiento de autoejecución de Flow Layout de UICollectionView. Después de mucha frustración, el problema se reduce al hecho de que tan pronto como se establece el tamaño estimatedItemSize
del tamaño en un tamaño distinto de cero, el desplazamiento ya no funciona correctamente.
En mi ejemplo, en lugar de mostrar 40 elementos, solo muestra 32.
He copiado pegado el código de abajo. He probado muchas cosas comenzando con una versión de Swift.
Básicamente no puede calcular y / o actualizar correctamente la collectionViewContentSize()
Aquí hay una demo completa http://git.io/AIrHNA
¿Alguien puede señalarme en la dirección correcta?
Gracias
@implementation ViewControllerObjcC
static NSString * const reuseIdentifier = @"Cell";
-(UICollectionViewFlowLayout*)flowLayout{
return (UICollectionViewFlowLayout*)self.collectionViewLayout;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
CGSize estimatedSize = CGSizeMake(self.view.frame.size.width, 25.0);
BOOL testEstimatedItemSize = true;
if (testEstimatedItemSize) {
[self flowLayout].estimatedItemSize = estimatedSize;
}else{
[self flowLayout].itemSize = estimatedSize;
}
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return 40;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 40, 30)];
[cell.contentView addSubview:label];
label.text = [NSString stringWithFormat:@"%ld",(long)indexPath.row];
label.backgroundColor = [UIColor redColor];
return cell;
}
Del documento de Apple ,
Específicamente, se supone que las celdas que no están en pantalla son la altura estimada .
Esta es mi suposición.
Cuando la altura estimada es menor que la altura real de la celda, la predicción del tamaño del contenido de la vista de colección es menor que el tamaño del contenido real.
Por lo tanto, solo muestra 32 del total de 40 celdas.
En mi proyecto, todos los celsl se muestran cuando se usa un tamaño estimado grande.
De la documentación:
El valor predeterminado de esta propiedad es
CGSizeZero
. Al establecerlo en cualquier otro valor, la vista de recopilación consulta cada celda para su tamaño real utilizando el métodopreferredLayoutAttributesFittingAttributes:
la celda. Si todas sus celdas tienen la misma altura, utilice la propiedaditemSize
, en lugar de esta propiedad, para especificar el tamaño de celda.
Parece que no usas este método preferredLayoutAttributesFittingAttributes:
en tu proyecto ?, ¿has intentado implementarlo?
Por otro lado, esta solución se ve bien: especificando una dimensión de celdas en UICollectionView usando diseño automático