web-dev-qa-db-fra.com

UICollectionView: une ligne ou une colonne

Je souhaite utiliser UICollectionView pour afficher une liste de vignettes défilante horizontale. Toutefois, je souhaite que cette liste soit composée d'une seule ligne. Sur une autre vue, j'affiche les vignettes dans une UICollectionView mais celle-ci défile verticalement et se trouve dans une seule colonne.

Actuellement, je modifie la taille de la vue de collection pour qu'elle ne soit assez grande que pour un seul élément, de sorte qu'elle est automatiquement enroulée et fonctionne, mais maintenant, je traite des éléments de taille variable pour que cela ne fonctionne plus.

Comment faire en sorte qu'une UICollectionView affiche une ligne ou une colonne?

31
William T.

Je suppose que vous utilisez le Flow Layout..__ intégré. Cependant, dans votre cas, vous devriez créer un UICollectionView Layout..__ personnalisé. Créez-le sous-classe de UICollectionViewFlowLayout et ajoutez ce code dans la méthode init:

- (id)init {
    if ((self = [super init])) {
        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        self.minimumLineSpacing = 10000.0f;
    }
    return self; 
}

La minimumLineSpacing est la clé pour que vous ayez une ligne ici.

J'espère que ça aide!

26
Nikola Kirev

J'ai constaté que le réglage de la minimumLineSpacing rendait ma zone de défilement très grande et que le réglage de minimumInteritemSpacing=big permettait de conserver les éléments dans une ligne ou une colonne de défilement, centrée au milieu de la collectionview.

12
sidekickr

Il n'y a pas vraiment de raison de sous-classer si vous pouvez faire confiance au transtypage.

((UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout).minimumLineSpacing = 1000.0f;

Si votre collectionView est chargée à partir d'un nib, vous pouvez également jouer avec les paramètres des inspecteurs d'attributs et de taille.

Il en va de même pour la direction de défilement.

9
atreat

Pour Swift 3 

let flowLayout = UICollectionViewFlowLayout()
flowLayout.itemSize = CGSize(width: UIScreen.main.bounds.width/2-10, height: 190)
flowLayout.sectionInset = UIEdgeInsetsMake(0, 5, 0, 5)
flowLayout.scrollDirection = UICollectionViewScrollDirection.horizontal
flowLayout.minimumInteritemSpacing = 0.0
self.gCollectionView.collectionViewLayout = flowLayout
2
Azhar

Lorsque vous initiez votre UICollectionView, passez la UICollectionViewFlowLayout suivante dans le paramètre init. 

Remarque: Il n'est pas nécessaire de créer une sous-classe de UICollectionViewFlowLayout.

var collectionViewFlowControl = UICollectionViewFlowLayout()
collectionViewFlowControl.scrollDirection = UICollectionViewScrollDirection.Horizontal

Pour un espacement de cellule de 0 px:

collectionViewFlowControl.minimumInteritemSpacing = 0;
collectionViewFlowControl.minimumLineSpacing = 0;

collectionView = UICollectionView(frame: CGRectMake(0, 0, self.view.frame.size.width, 120), collectionViewLayout: collectionViewFlowControl)
2
Ilker Baltaci

Je voulais une colonne alignée à gauche et les autres réponses ne m'ont pas aidé.

Voici donc ma solution très simple pour une colonne, alignée à gauche:

class GCOneColumnLeftAlignedFlowLayout: UICollectionViewFlowLayout {
    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let attributes = super.layoutAttributesForElements(in: rect)

        var y: CGFloat = sectionInset.top
        attributes?.forEach { layoutAttribute in
            layoutAttribute.frame.Origin.x = sectionInset.left
            layoutAttribute.frame.Origin.y = y
            y = y + layoutAttribute.frame.height + minimumLineSpacing
        }

        return attributes
    }
}

vous devriez aussi mettre quelque chose comme

estimatedItemSize = CGSize(width: 120, height: 40)

N'oubliez pas de supprimer la ligne

minimumLineSpacing = big number

Des autres solutions.

J'espère que cela sera utile car c'est une approche complètement différente des autres réponses.

0
Gerd Castan
 UICollectionViewFlowLayout *layout=[[UICollectionViewFlowLayout alloc] init];
 [layout setScrollDirection:UICollectionViewScrollDirectionHorizontal];

 layout.minimumInteritemSpacing = 0;
 layout.minimumLineSpacing = 0;


 blendEffectCollectionView=[[UICollectionView alloc] initWithFrame:CGRectMake(0, 95, 320, 60) collectionViewLayout:layout];
 [blendEffectCollectionView setDataSource:self];
 [blendEffectCollectionView setDelegate:self];
 [blendEffectCollectionView registerClass:[BlendModeCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
 [blendEffectCollectionView setBackgroundColor:[UIColor clearColor]];

 [bottomActivityView addSubview:blendEffectCollectionView];
0
ajjjjjjjj