web-dev-qa-db-fra.com

Comment redimensionner les cellules de la vue collection en fonction de la taille de l'écran du périphérique?

J'ai remarqué que les cellules suivraient toujours la définition de l'inspecteur de taille. Même si j'ai déjà appliqué UICollectionViewDelegateFlowLayout.

 enter image description here

 enter image description here

Donc, c'est comme ça. Mais je veux que les cellules ressemblent plutôt à comment c'était sur un écran d'iPhone plus petit.

 enter image description here

12
Chris Mikkelsen
- (CGSize)collectionView:(UICollectionView *)collectionView 
              layout:(UICollectionViewLayout *)collectionViewLayout 
   sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

   CGFloat height = self.view.frame.size.height;
   CGFloat width  = self.view.frame.size.width;
   // in case you you want the cell to be 40% of your controllers view
   return CGSizeMake(width * 0.4, height * 0.4);
 }
33
Marat Ibragimov

Swift 4

Vous pouvez faire quelque chose comme ça:

class yourClassName: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {


    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
            return CGSize(width: self.myCollectionView.frame.height / 6 * 5, height: self.myCollectionView.frame.height / 6 * 5)

        }


}

self.myCollectionView est la référence de votre vue de collection. 
il est important de mettre en œuvre UICollectionViewDelegateFlowLayout

Et comme il ne conviendra pas à une autre cellule, vous n’auriez qu’une rangée.

9
Βασίλης Δ.

Vous devriez essayer d'utiliser une équation simple lorsque vous définissez la taille de votre cellule plutôt que le nombre, comme ceci:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: view.frame.width / 2, height: 350)
    }

en le divisant par 2, la cellule aura toujours la moitié de la taille de l'écran, des fonctions de suppression et des types de fonctions minimumLineSpacing et/ou des méthodes UIEdgeInset que vous avez appelées. J'espère que cela t'aides.

4
Daniel Dramond

Dans Swift 3, vous pouvez redimensionner la cellule de la vue de collection en fonction de l'écran à l'aide de la propriété collectionViewLayout.

C'est à dire.

   let numberOfCell = 3
   let cellSpecing = 10
   if let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout {
        layout.itemSize = CGSize(width: (screenSize.width - (cellSpecing * (numberOfCell + 1))) / numberOfCell, height: cellHeight)
        layout.invalidateLayout()
    }
1
Rohit Parsana

dans Swift 4  

Vous pouvez simplement étendre votre contrôleur de vue de UICollectionViewDelegateFlowLayout et implémenter cette méthode:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let height = collectionView.frame.height
        let width  = collectionView.frame.width
        return CGSize(width: width, height: height)
    }

dans cet exemple, la largeur des cellules est égale à la largeur de la variable CollectionView que vous pouvez adapter. Elle dépend de vos besoins. 

1
SafoineMoncefAmine

Selon mon expérience, vous devez utiliser des méthodes UICollectionView pour obtenir la taille de cellule de la vue de collection spécifique à un périphérique. Les méthodes ci-dessous vous permettent d'obtenir la largeur et la hauteur dynamiques d'une cellule de la vue de collection.

// Dynamic width & height
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    float cellSize = collectionView.frame.size.width/values.count;
    return CGSizeMake(cellSize - 10, collectionView.frame.size.height);
}

//For top/bottom/left/right padding method
- (UIEdgeInsets)collectionView:(UICollectionView*)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
    return UIEdgeInsetsMake(0, 0, 0, 1);
}



- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    float width = collectionView.frame.size.width;
    float spacing = [self collectionView:collectionView layout:collectionViewLayout minimumInteritemSpacingForSectionAtIndex:section];
    int numberOfCells = (width + spacing) / (cellSize + spacing);
    int inset = (width + spacing - numberOfCells * (cellSize + spacing) ) / 2;

    return UIEdgeInsetsMake(0, inset, 0, inset);
}
- (CGFloat)collectionView:(UICollectionView *) collectionView layout:(UICollectionViewLayout *)collectionViewLayout
minimumInteritemSpacingForSectionAtIndex:(NSInteger) section
{
    return 1.0;
}

J'espère que cela vous aidera à concevoir votre cellule en fonction de la taille de l'appareil.

1
CodeChanger