Estoy construyendo una UICollectionView y mi costumbre de las células contienen dos etiquetas y una imagen.

Cada imagen se descargará de forma asíncrona, así que no sé es de tamaño hasta que la descarga se complete.
Una vez descargado, quiero adaptar a cada célula para la re-distribución del contenido y el marco para que se ajuste en altura de la imagen que acaba de descargar.

Como UICollectionViewLayout, estoy usando CHTCollectionViewWaterfallLayout

Para descargar la imagen de forma asincrónica estoy usando SDWebImage, como este:

    [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) 
                                {... some completion code here ...}];

PREGUNTA:

¿Cuál es el enfoque correcto para el tamaño de cada UICollectionViewCell justo después de la imagen se descarga?

OriginalEl autor Fmessina | 2014-04-16

3 Comentarios

  1. 26

    Sólo debe ser capaz de invalidar su colección de diseño de la visualización de una animación bloque cuando la imagen vuelve. Las cosas podrían ser un poco complicado si más de una imagen de acabados de la finalización de una vez, pero esto debería funcionar:

    [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType)^{
                              [UIView animateWithDuration:0.3f animations:^{
                                  [self.collectionView.collectionViewLayout invalidateLayout];
                              }];
                          }];

    A continuación, acabo de volver de un tamaño diferente en el correspondiente método de delegado.

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
        return /* a different size if the image is done downloading yet */;
    }
    Gracias! Estoy consiguiendo un resultado perfecto la primera vez que el UICollectionView se carga, pero cuando se cargan para el segundo tiempo (por ejemplo, pasando a otro punto de vista y volver) me siento raro de células de tamaños de imagen (más pequeño de lo esperado, con un contenido de superposición). Si me desplazarse un poco, todo se muestra correctamente de nuevo. ¿Tengo que cambiar la celda de tamaño de fotograma (y donde) después de que la imagen se descarga?
    Solucionado. En realidad no había nada que hacer nada con el celular de marco. Yo solo tuve que configurar la celda.imageView marco justo antes de la animateWithDuration bloque. [cell.imageView setFrame:CGRectMake(2,2,image.size.width,image.size.height])]; [UIView animateWithDuration:0.3f animations:^{ [self.collectionView.collectionViewLayout invalidateLayout]; }];
    Debo estar llamando de esta manera con una devolución de llamada, porque si yo tengo un problema ya que se espera un retorno de expresión, ya que lo he llamado en cada celda? stackoverflow.com/questions/23316634/… Que es lo que yo escribí, y en realidad estaba tratando de redimensionar pero no se mantiene la relación de aspecto y en su lugar se corta un trozo de la imagen?
    Lo hizo volver en tamaño sizeForItemAtIndexPath método?

    OriginalEl autor Ash Furrow

  2. 1

    Para cambiar el tamaño de la colección de vista de las células, puede volver a cargar la vista de colección y devolver el tamaño de recopilación de vista de las células de forma dinámica en el método:

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
        UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
        return [cell size];
    }

    En los casos en que el tamaño de la célula es dinámica, conseguir la celda de la ruta del índice y volver a su tamaño según el tamaño de la imagen. Por lo general crear un método para que la célula devolver una dinámica de tamaño, como en el ejemplo anterior. Usted puede utilizar UIImage del tamaño de la propiedad para ayudar a devolver el tamaño basado en la imagen.

    Cuando debo volver a cargar la vista de colección, después de que todas las imágenes se descargan? O es mejor volver a cargar cada celda con reloadItemsAtIndexPaths?
    Haciéndolo de esta manera, usted tendría que volver a cargar la vista de colección después de la descarga de todas las imágenes.
    que parte de la respuesta que se merecía un voto?
    +1 porque incluso si su respuesta no resuelve mi problema, he utilizado la idea de un [tamaño de celda] método. Sin embargo @Ceniza solución era lo que yo estaba buscando.
    No debe llamar a dequeueReusableCellWithReuseIdentifier: varias veces sin volver a la celda a la colección, por ejemplo, en cellForItemAtIndexPath:. La colección tendrá cientos de eliminando las células sentados alrededor de la que nunca volvió a ser reutilizados.

    OriginalEl autor Chris

  3. 0

    Usted podría intentar reloadItemsAtIndexPaths: para las células que termine de cargar.

    OriginalEl autor Rivera

Dejar respuesta

Please enter your comment!
Please enter your name here