Esta pregunta se ha hecho un par de veces, pero ninguna de las respuestas son lo suficientemente detallados como para mí entender por qué/cómo funcionan las cosas. Para hacer referencia a otro de MODO que las preguntas son:

Cómo actualizar el tamaño de las células en UICollectionView después de los datos de una celda se establece?

Cambiar el tamaño de UICollectionView células después de que sus datos se ha establecido

Donde para determinar la altura de un dinámicamente el tamaño de UICollectionViewCell?

Estoy usando MVC, pero para mantener las cosas simples digamos que tengo un ViewController que en ViewWillAppear llama a un servicio web para cargar algunos datos. Cuando los datos se han cargado llama

[self.collectionView reloadData]

El auto.collectionView contiene 1 UICollectionViewCell (vamos a llamar a DetailsCollectionViewCell).

Cuando el sí mismo.collectionView se crea primero las llamadas sizeForItemAtIndexPath y, a continuación, cellForItemAtIndexPath. Esto provoca un problema para mí, porque es sólo durante cellForItemAtIndexPath que me puse el resultado de que el servicio web DetailsCollectionViewCell a través de:

    cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"detailsCell" forIndexPath:indexPath];
    ((DetailsCollectionViewCell*)cell).details = result;

DetailsCollectionViewCell tiene un setter de la propiedad de los detalles que hace algún trabajo que tengo que pasar primero saber cuál es el correcto tamaño de la celda debe ser.

Basado en los enlaces de las preguntas de arriba parece que la única forma de fuego sizeForItemAtIndexPath después de cellForItemAtIndexPath es llamar

[self.collectionView.collectionViewLayout invalidateLayout];

Pero donde esta el resto de preguntas no trabajo para mí, porque a pesar de que las llamadas sizeForItemAtIndexPath y me permite agarrar suficiente información de DetailsCollectionViewCell ajustar la altura de la no actualización de la interfaz de usuario hasta después de que el usuario se desplaza por la UICollectionView y mi conjetura es que tiene algo que ver con esta línea a partir de la documentación

La configuración real de la actualización se produce durante la próxima vista de diseño del ciclo de actualización.

Sin embargo, estoy perplejo sobre cómo conseguir alrededor de esto. Casi se siente como si la necesidad de crear un método estático en DetailsCollectionViewCell que me puede pasar la web del servicio de resultado durante el primer sizeForItemAtIndexPath pasar y, a continuación, sólo caché de ese resultado. Pero tengo la esperanza de que hay una solución sencilla para tener la interfaz de usuario que actualice automáticamente en su lugar.

Gracias,

p.s. – Primero, ASÍ que pregunta, así que espero que me siguió todas las reglas correctamente.

OriginalEl autor Stringer Bell | 2014-05-18

2 Comentarios

  1. 2

    Realidad, de lo que he encontrado, llamando a invalidateLayout hará llamar sizeForItemAtIndexPath para todas las células cuando la cola de celda siguiente (esto es para iOS < 8.0, ya 8.0 se volverá a calcular de diseño en la vista siguiente, diseño de actualización).

    Por lo que la solución que se me ocurrió, es la creación de subclases UICollectionView, y reemplazar layoutSubviews con algo como esto:

    - (void)layoutSubviews
    {
        if ( self.shouldInvalidateCollectionViewLayout ) {
            [self.collectionViewLayout invalidateLayout];
            self.shouldInvalidateCollectionViewLayout = NO;
        } else {
            [super layoutSubviews];        
        }
    }
    

    y, a continuación, llamar a setNeedsLayout en cellForItemAtIndexPath y configuración de shouldInvalidateCollectionViewLayout para SÍ. Esto funcionó para mí en iOS >= 7.0. También he implementado estimado del tamaño de los elementos de esta manera. Thx.

    Podría usted ampliar su respuesta aquí? .shouldInvalidateCollectionViewlayout no es una propiedad en UICollectionView?
    He implementado este, pero mis células son todavía sólo cambio de tamaño después me desplazo a la vista de colección. los pensamientos?

    OriginalEl autor user3780773

  2. 0

    Aquí mi caso y la solución.

    Mi collectionView es en un scrollView y quiero que mi collectionView y sus células para cambiar el tamaño de como estoy de desplazamiento de mi scrollView.

    Así que en mi UIScrollView delegado método : scrollViewDidScroll :

    [super scrollViewDidScroll:scrollView];
    
    if(scrollView.contentOffset.y>0){
    
        CGRect lc_frame = picturesCollectionView.frame;
        lc_frame.origin.y=scrollView.contentOffset.y/2;
        picturesCollectionView.frame = lc_frame;
    }
    else{
    
        CGRect lc_frame = picturesCollectionView.frame;
        lc_frame.origin.y=scrollView.contentOffset.y;
        lc_frame.size.height=(3*(contentScrollView.frame.size.width/4))-scrollView.contentOffset.y;
        picturesCollectionView.frame = lc_frame;
    
        picturesCollectionViewFlowLayout.itemSize = CGSizeMake(picturesCollectionView.frame.size.width, picturesCollectionView.frame.size.height);
        [picturesCollectionViewFlowLayout invalidateLayout];
    }
    

    Tuve que volver a configurar el collectionViewFlowLayout tamaño de la celda, a continuación, invalida su diseño.
    Espero que ayude !

    OriginalEl autor Bejil

Dejar respuesta

Please enter your comment!
Please enter your name here