web-dev-qa-db-fra.com

Différentes tailles de cellule dans UICollectionview

Dans mon application iphone, je montre des images sur une vue de collection. Je récupère les images des URL, avec les URL j'obtiens également la taille de l'image. par exemple: - disons qu'il existe deux types d'images paysage et portrait.J'obtiens la valeur P pour les images portrait et L pour les images paysage

Comment personnaliser la taille de la cellule collectionView?

24
New Jango Tester

Utilisez cette méthode UICollectionViewDelegateFlowLayout

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

1) Vous pouvez gérer et échanger plusieurs objets de mise en page, mais il existe un moyen plus simple. Ajoutez simplement les éléments suivants à votre sous-classe UICollectionViewController et ajustez les tailles selon les besoins:

- (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];
}

Appeler -performBatchUpdates:completion: invalidera la disposition et redimensionnera les cellules avec une animation (vous pouvez simplement passer nil aux deux paramètres de bloc si vous n'avez aucun réglage supplémentaire à effectuer).

2) Au lieu de coder en dur les tailles des éléments dans -collectionView:layout:sizeForItemAtIndexPath, il suffit de diviser la hauteur ou la largeur des limites de collectionView par le nombre de cellules que vous souhaitez ajuster à l'écran. Utilisez la hauteur si votre UICollectionView défile horizontalement ou la largeur si elle défile verticalement.

9
user3124624

C'est ce que j'ai fait. J'ai d'abord défini la taille de la cellule en fonction de la taille de l'écran (afin que nous puissions obtenir le meilleur nombre d'images sur chaque ligne). Vous voudrez peut-être modifier les chiffres en fonction de votre cause.

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
CGFloat widthOfCell =(self.view.frame.size.width-30)/2;
CGFloat heightOfCell =widthOfCell * 1.33;
CGSize returnValue = CGSizeMake(widthOfCell, heightOfCell);
returnValue.height += 5; 
returnValue.width += 5; 
return returnValue;

}

J'ai ensuite utilisé une méthode de manipulation d'image pour déterminer l'état du paysage ou du portrait, et (pour mon application) j'ai décidé de faire de chaque image un portrait:

    if (sourceImage.size.width>sourceImage.size.height) {
    sourceImage = [[UIImage alloc] initWithCGImage: sourceImage.CGImage
                                             scale: 1.0
                                       orientation: UIImageOrientationRight];
    }

Si vous voulez l'avoir dans l'autre sens, permutez le > avec <

CAVEAT: ma méthode de rotation ne prend pas en compte si l'image pointe vers la gauche ou la droite. En d'autres termes, si une image est en paysage à l'envers, mon code ne peut pas le reconnaître. J'espère que quelqu'un d'autre pourra vous aider cependant, et j'espère que je ne suis pas sorti de la piste! :)

2
Septronic

Pour Swift étendez la présentation à votre contrôleur de vue, si vous avez besoin d'afficher des images dynamiques sur une cellule, faites une variable qui contient le nom des images dans votre contrôleur de vue et utilisez ceci:

let imageData = ["image1","image2","image3","image4"]

extension yourViewController: UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout{
  func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let photo = UIImage(named: imageData[indexPath.row])
        return CGSize(width: (photo?.size.width)!, height: (photo?.size.height)!)

}

}

1
bikram sapkota