web-dev-qa-db-fra.com

UICollectionView défilement dans les deux sens

J'ai créé une UICollectionView avec un parchemin vertical. 

La largeur de la cellule est supérieure à la largeur de l'écran. J'ai donc créé une variable customFlowLayout basée sur la disposition UICollectionViewFlow et renvoyant la bonne taille de contenu calculée. 

Cependant, cela ne fonctionne pas. Lorsque la largeur de la cellule est inférieure à la largeur de l'écran, cela fonctionne. Cela signifie-t-il que nous ne pouvons pas avoir plus de largeur que la largeur de l'écran en défilement vertical?

Il en va de même pour le défilement horizontal, mais la hauteur de CollectionView est alors limitée à la hauteur de l'écran.

Y a-t-il un moyen de le faire fonctionner?

19
rbmanian75

j'ai trouvé ceci UICollectionView: Comment définir un UICollectionViewLayout qui prend en charge le défilement horizontal et vertical?

l'exemple fourni par Jirune semble être la clé. Mais s'il était possible d'utiliser des lignes collectionview au lieu de sections pour des lignes, ce serait bien ..

3
rbmanian75

Comme d'autres l'ont déjà dit, la UICollectionView ne peut faire défiler qu'une direction à l'aide d'une disposition de flux. Cependant, vous pouvez y parvenir très facilement sans créer de présentation personnalisée ni utiliser une bibliothèque tierce.

Lorsque vous exposez votre point de vue dans le story-board, vous pouvez placer votre UICollectionView intégrée dans une UIScrollView. Faites défiler l'affichage de défilement pour faire défiler horizontalement et la variable UICollectionView pour faire défiler verticalement. Puis définissez le UICollectionView.delaysContentTouches sur true pour que les touches passent à la UIScrollView et ne pensez pas que vous essayez de faire défiler la collection.

Lorsque vous configurez la UICollectionView, définissez sa taille et celle des cellules sur ce que vous voulez réellement (plus large que l'écran réel) et disposez-les en conséquence.

Maintenant, dans la variable UIViewController, mettez ce code dans le cycle de vie de la vue.

    - (void)viewDidLayoutSubviews {
        self.myScrollView.contentSize = self.myCollectionView.frame.size;
    }

C'est littéralement tout ce que vous devez faire pour accomplir ce que vous décrivez. Maintenant, votre vue de défilement devrait vous permettre de faire défiler horizontalement pour afficher votre cellule entière et votre collectionView devrait faire défiler verticalement vos cellules.

Bonne programmation.

13
johnrechd

Je ne suis pas sûr d'avoir compris votre problème. 

Mais si vous avez créé une mise en page personnalisée, assurez-vous d'avoir implémenté:

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath;

et que le cadre et la taille de vos attributs de présentation sont définis avec les valeurs correctes pour votre chemin d’index "grande cellule". 

Assurez-vous également que vous avez implémenté: 

- (CGSize) collectionViewContentSize;

Cette méthode renvoie la taille du contenu de la vue de la collection. Si contentSize.width> youAppFrame.width, vous devez avoir le défilement horizontal. Même chose pour la hauteur et le défilement vertical. 

Assurez-vous également que votre collectionView permet le défilement et que votre mise en page est préparée correctement à l'aide de:

- (void)prepareLayout

En passant, avez-vous surchargé UICollectionViewLayout ou UICollectionViewFlowLayout pour votre mise en page?

0
CitronEvanescent

Avant de pouvoir le faire, vous DEVEZ utiliser un type de mise en page différent. La structure de flux représente ses éléments sous forme de liste et les recouvre de cellules en fonction de la largeur disponible . Si vous souhaitez un défilement horizontal et vertical, vous devez spécifier le nombre de colonnes de votre grille. le FlowLayout n'a pas cela. Une solution simple consiste à créer une sous-classe de UICollectionViewLayout et à remplacer collectionViewContentSize pour lui redonner une largeur = la somme des largeurs de cellules d’une ligne (c’est là qu’il est nécessaire de connaître le nombre de colonnes souhaitées), ainsi que tout espacement supplémentaire entre elles. leur. Cela fonctionnera correctement si vos cellules ont la même taille par colonne, similaire à une grille.

0
Radu Simionescu