web-dev-qa-db-fra.com

Propriété de la taille de cellule prototype UICollectionView iOS iOS ignorée

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?

62
minerat

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)
    }
}
171
Alex the Ukrainian

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);
19
Sam

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.

7
mxwt

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!

1
S E

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é.

1
Wanbok Choi

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.

0
theDuncs

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;
}   
0
Naman Vaishnav