UICollectionView显示不同的单元格取决于方向

时间:2015-05-05 20:04:43

标签: ios objective-c uicollectionview uicollectionviewcell uicollectionviewlayout

我想根据屏幕宽度设置UICollectionViewCell的宽度。当它处于纵向模式时,我想显示3个细胞,如果是横向,我想要显示4个细胞。

我也希望在单元格之间有一些填充,但下面的代码对我没有帮助:

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    return UIEdgeInsetsMake(20, 20, 0, 20);
}

我认为它应该在单元格的顶部,左侧和右侧添加填充。

如果我看到肖像模式,那么:

***cell*** *padding* ***cell*** *padding* ***cell***

如果是风景:

 ***cell*** *padding* ***cell*** *padding* ***cell*** *padding* ***cell***

因此填充应该每次都有不同方向的相同大小。

假设它应该是20pt

此外,我想在每个单元格上方添加20 pt填充。

我应该编写一些自定义流程布局吗?

2 个答案:

答案 0 :(得分:1)

对于Swift 3:

  1. 使用您的UICollectionView创建一个@IBOutlet(我的名字叫做picCollectionView)
  2. 将此代码放入viewDidLoad

    override func viewDidLoad() {
    super.viewDidLoad()
    
    let itemSize = UIScreen.main.bounds.width/3 - 2
    
    let layout = UICollectionViewFlowLayout()
    layout.itemSize = CGSize(width: itemSize, height: itemSize)
    layout.minimumInteritemSpacing = 2
    layout.minimumLineSpacing = 2
    
    picCollectionView.collectionViewLayout = layout
    

    }

  3. 跨越的列数将随设备方向自动更改

  4. 您可以通过更改minimumInteritemSpacing和minimumLineSpacing来调整填充

  5. 希望这有帮助!

答案 1 :(得分:0)

当方向/尺寸类改变时,您应该使布局无效:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];

    if (self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass) {
        [self.collectionView.collectionViewLayout invalidateLayout];
    }
}

然后适当调整您在collectionView:layout:insetForSectionAtIndex:中返回的值(我在这里选择了随机值):

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact) {
        return UIEdgeInsetsMake(20, 20, 0, 20);
    } else {
        return UIEdgeInsetsMake(40, 40, 0, 40);
    }
}