Estoy utilizando un UICollectionView con UICollectionViewFlowLayout.

Me ajustar el tamaño de cada célula a través de la

collectionView:layout:sizeForItemAtIndexPath:

Cuando se cambia de vertical a horizontal, me gustaría ajustar el tamaño de cada celda completamente ajuste el tamaño de la CollectionView, sin dejar de relleno del espacio entre las células.

Preguntas:

1) Cómo cambiar el tamaño de una celda después de una rotación de evento?

2) Y, mejor aún, de cómo hacer el diseño, donde las células siempre ajuste el tamaño de la pantalla?

  • followben la respuesta es actualmente aceptado, pero tiene algunos problemas: se producirá un error de la consola y la animación para el nuevo tamaño no va a suceder correctamente. Ver mi respuesta para la correcta implementación.
  • su respuesta va a funcionar mejor, donde una colección de sólo vista muestra una sola de gran tamaño de la celda a la vez. En ese caso, tiene sentido UIKit se queja de rotación, ya que va a ser la consulta de sizeForItemAtIndexPath antes de llamar a didRotateFromInterfaceOrientation. Sin embargo, para una vista de colección con múltiples celdas en la pantalla, lo que invalida el diseño antes de rotación provoca un desagradable, visible salto en tamaño antes de la vista de la gira. En esa instancia, creo que mi respuesta sigue siendo la más correcta aplicación.
  • De acuerdo en que cada uno tiene sus problemas en diferentes casos de uso. En este caso, sin embargo, la OP indica I would like to adjust the size of each cell to **completely fit the size of the CollectionView** que es exactamente la solución que se propone en mi respuesta. Si se puede incluir mi solución en su respuesta y tomar nota de que el enfoque funciona mejor bajo qué condiciones sería lo suficientemente bueno para mí.
InformationsquelleAutor Fmessina | 2012-11-25

6 Comentarios

  1. 200

    1) Usted puede mantener y cambiar varios objetos de la presentación, pero hay una manera más sencilla. Simplemente añada lo siguiente a su UICollectionViewController subclase y ajustar el tamaño de lo requerido:

    - (CGSize)collectionView:(UICollectionView *)collectionView
                      layout:(UICollectionViewLayout *)collectionViewLayout
      sizeForItemAtIndexPath:(NSIndexPath *)indexPath
    {    
        //Adjust cell size for orientation
        if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
            return CGSizeMake(170.f, 170.f);
        }
        return CGSizeMake(192.f, 192.f);
    }
    
    - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
    {
        [self.collectionView performBatchUpdates:nil completion:nil];
    }

    Llamar -performBatchUpdates:completion: la nulidad de la disposición y tamaño de las células con la animación (sólo se puede pasar nil tanto en el bloque de parámetros si no tienes extra ajustes a realizar).

    2) en Lugar de codificar los tamaños de los elementos en -collectionView:layout:sizeForItemAtIndexPath, solo hay que dividir la altura o la anchura de la collectionView límites por el número de celdas que desea ajustar en pantalla. El uso de la altura si su collectionView se desplaza horizontalmente o el ancho si se desplaza verticalmente.

    • La solución propuesta por Fiveagle está trabajando demasiado, pero esta es la solución que he preferido.
    • ¿Cómo manejar la orientación cambiar mientras el foco está en otro punto de vista controlador, a continuación, el enfoque se vuelve a la vista original de la controladora. Actualmente, mis células conservan el tamaño determinado por la orientación que estaban a la izquierda, pero en la nueva orientación.
    • nm, acabo de invocar [auto.collectionView performBatchUpdates:nil finalización:nil]; durante viewDidAppear
    • ¿por qué no llamar a [self.collectionView.collectionViewLayout invalidateLayout];?
    • Llamar invalidateLayout re-extraer las células con el tamaño correcto, pero -performBatchUpdates:completion: va a animar los cambios, que se ve mucho mejor en mi humilde opinión.
    • En mi caso el código no cambiar el tamaño de la collectionviewcell hasta que desplazarse por la pantalla.
    • Gran sugerencia
    • didRotateFromInterfaceOrientation en desuso en iOS 8
    • En iOS8, estoy llamando a la coordinator.animateAlongsideTransition en viewWillTransitionToSize, y llamando performBatchUpdates dentro de su animation bloque. Esto le da un bonito efecto de animación.
    • He tenido que añadir en esta re-desplazamiento de la celda adecuado cuando los elementos son la totalidad de la pantalla.
    • WoooooW.. muchas Gracias..

  2. 33

    Si no quieres adicionales animaciones traído por performBatchUpdates:completion:, sólo tiene que utilizar invalidateLayout a la fuerza de la collectionViewLayout para recargar.

    - (void)viewWillLayoutSubviews
    {
        [super viewWillLayoutSubviews];
        [self.collectionView.collectionViewLayout invalidateLayout];
    }
  3. 13

    He resuelto mediante dos UICollectionViewFlowLayout. Uno para la orientación vertical y uno horizontal. Yo asignarlos a mi collectionView dinámicamente en viewDidLoad

    self.portraitLayout = [[UICollectionViewFlowLayout alloc] init];
    self.landscapeLayout = [[UICollectionViewFlowLayout alloc] init];
    
    UIInterfaceOrientation orientationOnLunch = [[UIApplication sharedApplication] statusBarOrientation];
    
    if (UIInterfaceOrientationIsPortrait(orientationOnLunch)) {
        [self.menuCollectionView setCollectionViewLayout:self.portraitLayout];
    } else {
        [self.menuCollectionView setCollectionViewLayout:self.landscapeLayout];
    }

    A continuación, simplemente he modificado mi collectionViewFlowLayoutDelgate Métodos como este

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
        CGSize returnSize = CGSizeZero;
    
        if (collectionViewLayout == self.portraitLayout) {
            returnSize = CGSizeMake(230.0, 120.0);
        } else {
            returnSize = CGSizeMake(315.0, 120.0);
        }
    
        return returnSize;
    }

    Último puedo cambiar de un diseño a otro en la rotación

    - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
        if (UIInterfaceOrientationIsPortrait(fromInterfaceOrientation)) {
            [self.menuCollectionView setCollectionViewLayout:self.landscapeLayout animated:YES];
        } else {
            [self.menuCollectionView setCollectionViewLayout:self.portraitLayout animated:YES];
        }
    }
    • Gracias!! Voy a probar tu solución más tarde y voy a dejar que usted sabe.
  4. 8

    Hay una forma sencilla de configurar vista de colección de tamaño de la celda:

    UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout;
    layout.itemSize = CGSizeMake(cellSize, cellSize);

    No estoy seguro si es animada, aunque.

  5. 7

    Swift : Colección de Vistas de la Célula que es el n% de la altura de la pantalla

    Que yo necesitaba era un celular que fue un cierto porcentaje de los puntos de vista de la altura, y el tamaño con la rotación del dispositivo.

    Con la ayuda de lo alto, aquí está la solución

    override func viewDidLoad() {
        super.viewDidLoad()
        automaticallyAdjustsScrollViewInsets = false
        //if inside nav controller set to true
    }
    
    override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
        collectionViewLayout.invalidateLayout()
    }
    
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        return CGSize(width: 100, height: collectionView.frame.height * 0.9)
    }
  6. 2

    Si usted está usando autolayout.Usted necesidad justa de invalidate layout en su controlador de vista al girar y ajustar offset en su diseño de flujo de la subclase.

    Así, En su vista controlador –

    override func willRotateToInterfaceOrientation(toInterfaceOrientation:     UIInterfaceOrientation, duration: NSTimeInterval) {
        self.galleryCollectionView.collectionViewLayout.invalidateLayout()
    }

    Y en su FlowLayout Subclass

    override func prepareLayout() {
        if self.collectionView!.indexPathsForVisibleItems().count > 0{
        var currentIndex : CGFloat!
        currentIndex = CGFloat((self.collectionView!.indexPathsForVisibleItems()[0] as! NSIndexPath).row)
        if let currentVal = currentIndex{
            self.collectionView!.contentOffset = CGPointMake(currentIndex * self.collectionView!.frame.width, self.collectionView!.contentOffset.y);
        }   
        }     
    }
    • Esto funciona muy bien! willRotateToInterfaceOrientation está en desuso en iOS 8 pero viewWillTransitionToSize funciona igual de bien para esto.

Dejar respuesta

Please enter your comment!
Please enter your name here