Lorsque UICollectionView est rempli avec des éléments, ceux-ci vont toujours jusqu'aux bords de UICollectionView de la manière suivante:
---------------
|X X X X X X X|
|X X X X X X X|
|X X X X X X X|
|X X X X X X X|
|X X X X X X X|
|X X X X X X X|
---------------
Je voudrais placer une marge autour de chaque bord comme suit:
---------------
| X X X X X X |
| X X X X X X |
| X X X X X X |
| X X X X X X |
| X X X X X X |
| X X X X X X |
---------------
J'ai essayé d'y parvenir en plaçant UICollectionView dans son hébergement UIView en configurant son cadre pour simuler une bordure, mais il défile à l'intérieur du cadre afin d'être coupé en haut et en bas et le défilement apparaît également dans les limites du cadre.
J'ai regardé l'API mais je ne vois rien d'évident pour y parvenir. Des idées?
Dans
(UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
}
vous pouvez donner à vos cellules une marge sur le côté gauche.
Vous pouvez également créer des cellules personnalisées comportant une marge.
ou vous pouvez définir la propriété .sectionInset de votre CollectionviewFlowLayout
, ce qui devrait être le moyen le plus simple (si vous utilisez FlowLayout)
Je sais que cette question est ancienne, mais n'oubliez pas qu'UICollectionView hérite de UIScrollView.
UICollectionView *collectionView = [[UICollectionView alloc] init];
collectionView.contentInset = UIEdgeInsetsMake(x.x, x.x, x.x, x.x);
// Swift 3 for good measure
let collectionView = UICollectionView()
collectionView.contentInset = UIEdgeInsets(top: x.x, left: x.x, bottom: x.x, right: x.x)
Sachez que contentInset et sectionInset peuvent modifier l'espacement des cellules dans votre vue. Pour plus d'informations à ce sujet, voir this post.
Vous pouvez utiliser la fonction suivante.
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
return UIEdgeInsetsMake(50, 50,15,50);
}
Vous devrez jouer avec le nombre pour savoir comment forcer les objets collectionviewCells sur une seule ligne.
UIEdgeInsetsMake ( CGFloat top,CGFloat left,CGFloat bottom,CGFloat right);
Pour Swift 3
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsetsMake(10, 4, 10, 4)
}
Vous pouvez contrôler pratiquement chaque aspect de la grille avec le protocole de collectionview. Voici un exemple:
- (UICollectionViewFlowLayout *)collectionViewFlowLayout
{
UICollectionViewFlowLayout *flowLayout = [UICollectionViewFlowLayout new];
flowLayout.itemSize = CGSizeMake(180, 255);
flowLayout.sectionInset = UIEdgeInsetsMake(10, 30, 0, 30);
flowLayout.minimumInteritemSpacing = 0.0f;
flowLayout.minimumLineSpacing = 0.0f;
flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
return flowLayout;
}
Celui que vous voudriez changer dans votre cas est le sectionInsets
Swift 2.0
self.automaticallyAdjustsScrollViewInsets = false
self.collectionView.contentInset = UIEdgeInsets(top: 10, left: 0, bottom: 0, right: 0)
Swift 4 mis à jour ( Vinayak Kini answer):
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
}