Mi UICollectionView células contienen UILabels con varias líneas de texto. No sé la altura de las celdas hasta que el texto se ha establecido en la etiqueta.

-(CGSize)collectionView:(UICollectionView *)collectionView
                 layout:(UICollectionViewLayout*)collectionViewLayout
 sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

Este fue el método inicial miré en el tamaño de las células. Sin embargo, esto se llama ANTES de que las células se creó a partir del guión gráfico.

Hay una forma de diseño de la colección y el tamaño de las células DESPUÉS de que hayan sido prestados, y sé que el tamaño real de la celda?

InformationsquelleAutor Shocks | 2012-12-06

4 Comentarios

  1. 72

    Yo creo que tu estás buscando el invalidateLayout método puede llamar en el .collectionViewLayout propiedad de su UICollectionView. Este método regenera tu disposición, que en su caso significa también llamada -collectionView: layout: sizeForItemAtIndexPath:, que es el lugar adecuado para reflejar su elemento deseado tamaño. Jirune puntos en la dirección correcta en cómo calcularlas.

    Un ejemplo para el uso de invalidateLayout se puede encontrar aquí. Consulte también el UICollectionViewLayout documentación sobre ese método:

    Invalida el diseño actual y desencadena un esquema de actualización.

    Discusión:

    Puede llamar a este método en cualquier momento para actualizar la información de diseño. Este método invalida el diseño de la colección propia vista y se devuelve de inmediato. Por lo tanto, usted puede llamar a este método varias veces en el mismo bloque de código sin desencadenar la disposición de múltiples actualizaciones. La configuración real de la actualización se produce durante la próxima vista de diseño del ciclo de actualización.

    Edición:

    Para storyboard vista de colección que contiene auto restricciones de diseño, usted necesita para reemplazar viewDidLayoutSubviews método de UIViewController y llame a invalidateLayout de la colección de diseño de vista en este método.

    - (void)viewDidLayoutSubviews {
        [super viewDidLayoutSubviews];
        [yourCollectionView.collectionViewLayout invalidateLayout];
    }
    • Estoy siguiendo su enfoque de implementación, no es un problema que me encontré: después de llamar a invalidateLayout a veces las células desaparecen / get invisible, así que no se puede obtener de ellos en sizeForItemAtIndexPath con cellForItemAtIndexPath. Por cierto yo uso las células para obtener su tamaño, no tengo un almacén independiente para ello.
    • fresco thx ! mucho más mejor que volver a cargar los datos
    • Impresionante! Había atascado en el ancho de celda que no era cambiar a medida que se asigne por auto de diseño, pero después de leer esta solución me hizo darse cuenta de eso. P. S. I poner el código para el diseño automático problema, esperamos que te importa.
    • Muchas gracias ! Yo no sabía que esto iba a solucionar el problema ! Me estaba llamando reloadData y fue una costosa operación y no me da los resultados esperados, aunque.
  2. 5

    subclase UICollectionViewCell y reemplazar layoutSubviews como este

    por medio de la presente se le de anclaje celular bordes de ataque y salida a collectionView

    override func layoutSubviews() {
            super.layoutSubviews()
    
            self.frame = CGRectMake(0, self.frame.origin.y, self.superview!.frame.size.width, self.frame.size.height)
        }
  3. 4

    Hola, en el anterior delegate método en sí, se puede calcular la UILabel tamaño utilizando la siguiente manera engañosa y devolver el UICollectionViewCell size basa en el cálculo.

        //Calculate the expected size based on the font and 
        //linebreak mode of your label
        CGSize maximumLabelSize = CGSizeMake(9999,9999);
    
        CGSize expectedLabelSize = 
         [[self.dataSource objectAtIndex:indexPath.item] 
                 sizeWithFont:[UIFont fontWithName:@"Arial" size:18.0f] 
            constrainedToSize:maximumLabelSize 
                lineBreakMode:NSLineBreakByWordWrapping];
  4. 2
    - (void)viewDidLoad {
        self.collectionView.prefetchingEnabled = NO;
    }

    En iOS 10, prefetchingEnabled es YES por defecto. Cuando YES, la colección de la vista de las solicitudes de las células antes de cuando se deben mostrar. Esto conduce a la falla en iOS 10

    • Mientras que este fragmento de código es bienvenida, y puede proporcionar un poco de ayuda, sería mejora mucho si se incluye una explicación de como y porque esto resuelve el problema. Recuerde que usted está respondiendo a la pregunta para los lectores en el futuro, no sólo de la persona que hace la pregunta ahora! Por favor, editar su respuesta a agregar explicación, y da una indicación de lo que las limitaciones y supuestos que se aplican.
    • En iOS10, prefetchingEnabled es SÍ de forma predeterminada. Cuando SÍ, la colección de la vista de las solicitudes de las células antes de cuando se deben mostrar. Conduce a la caída en iOS10
    • Eso parece una buena explicación – por favor editar su respuesta a incorporar. Gracias!

Dejar respuesta

Please enter your comment!
Please enter your name here