J'utilise un UICollectionView avec deux cellules prototypes. Les cellules prototypes ont des largeurs différentes et contiennent différents contrôles (vue d'image et vue Web). Je retourne définitivement la cellule prototype correcte pour un index donné (toutes les cellules affichent le contenu correct), mais la taille de la cellule prototype est ignorée et la taille de l'élément de la vue de collection est utilisée à la place. Ce n'est pas comme si je définissais manuellement la taille. Quel est l'intérêt de permettre la taille de la cellule prototype dans le storyboard si la propriété est simplement ignorée lorsqu'elle est réellement affichée?
La taille de la cellule dans l'éditeur de storyboard sert uniquement à vous aider à concevoir la cellule. Comme chaque cellule prototype peut avoir une taille différente, UICollectionView ne sait pas quelle taille de cellule choisir pour toutes les cellules. C'est pourquoi vous définissez la taille réelle que vous souhaitez utiliser pour vos cellules séparément. Vous pouvez le faire dans le concepteur en sélectionnant la vue Collection et en définissant sa largeur et hauteur de cellule dans l'inspecteur Taille, sous l'en-tête "Taille de la vue de collection".
Ou bien, vous pouvez remplacer la méthode suivante et renvoyer un objet CGSize qui spécifie la taille que vous souhaitez utiliser pour chaque cellule. En utilisant cette méthode, vous pouvez avoir une taille différente pour chaque cellule:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
Exemple:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(100, 100);
}
Votre contrôleur de vue doit être un délégué de UICollectionViewDelegateFlowLayout pour que cette méthode soit appelée. N'oubliez donc pas d'ajouter cette déclaration de délégué au fichier .h de votre contrôleur de vue, tel que:
@interface MyViewController () <UICollectionViewDelegateFlowLayout>
rapide
extension MyViewController : UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: 100, height: 100)
}
}
Si toutes les cellules ont la même taille et que vous pouvez définir le itemSize
sur le UICollectionViewFlowLayout
Exemple:
((UICollectionViewFlowLayout *) self.collectionViewLayout).itemSize = CGSizeMake(100, 100);
Swift, travaillant pour la dernière iOS.
(collectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize = cellSize
Je n'ai pas assez de points pour répondre à Sam, mais l'essentiel est que ce n'est pas UICollectionViewLayout, mais UICollectionViewFlowLayout.
Dans Swift vous pouvez appeler la méthode déléguée sizeForItemAtIndexPath pour définir la taille de chaque cellule.
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
if indexPath.row == 0 {
// Set the size for cell no. 0
}else if indexPath.row == 1 {
// Set the size for cell no. 1
}
}
J'espère que ça aide. Merci!
Vous pouvez définir la taille de UICollectionViewCell
dans les propriétés UICollectionView
.
Dans Storyboard, sélectionnez Collection View
au Document Outline
, puis modifiez votre Cell Size
dans Size Inspector
.
Et vous devez définir le type de taille de la cellule sur Par défaut, s'il s'agit de Personnalisé.
Si toutes vos cellules ont la même taille, vous devez simplement définir les propriétés de taille de cellule de UICollectionView
sur les mêmes propriétés que celles de taille de UICollectionViewCell
.
Utilisez son délégué par défaut. . .
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
CGSize mElementSize;
mElementSize = CGSizeMake(SCREEN_WIDTH , SCREEN_HEIGHT *0.60);
return mElementSize;
}