【问题标题】:minimumInteritemSpacing is adding some strange content at the end of collection viewminimumInteritemSpacing 在集合视图的末尾添加了一些奇怪的内容
【发布时间】:2017-08-16 06:58:22
【问题描述】:

我正在尝试仅使用 1 行来实现水平滚动的集合视图。我发现实现这一目标的最简单方法是准备自定义流布局:

class CollectionViewLayoutHorizontal : UICollectionViewFlowLayout {
    override init() {
        super.init()
        //that enables self-sizing cells
        self.estimatedItemSize = CGSize(width: 1, height: 1)
        self.scrollDirection = .horizontal
        //that one should ensure that only one line fits
        //using CGFloat.greatestFiniteMagnitude aka CGFLOATMAX breaks collection view completely
        self.minimumInteritemSpacing = 1000
        self.minimumLineSpacing = 10
    }
}

我的所有单元格都正确显示 - 即使它们小得多,它们也是在集合视图的中间彼此相邻的位置。 但问题是最后(最后一个单元格之后)有一个额外的空白空间,大小为minimumInteritemSpacing,这是出乎意料的。

有人解决这个问题吗?

【问题讨论】:

    标签: ios swift autolayout uicollectionview uicollectionviewlayout


    【解决方案1】:

    我知道这是一个老问题,但仍然没有明确的答案。

    我最近在 iOS 12 上使用 Swift 4.2 时遇到了同样的问题。经过一些调查后,我发现如果您将 minimumLineSpacing 设置为小于其默认值(即 10)的任何值,那么流布局将将此差异乘以(项目数 - 1)作为额外空间添加到集合视图的末尾。 (貌似总contentSize不管用默认值计算?)

    无论如何,我可以通过将minimumInteritemSpacing 设置为与minimumLineSpacing 相同的值来解决这个问题,在我的情况下两者都是2

    我知道这没有任何意义,因为我的集合视图是单行的,具有水平滚动的集合视图流布局,所以minimumInteritemSpacing 应该对项目的布局没有影响,但显然它确实如此最后删除多余空间的技巧。

    【讨论】:

    • 2021,Xcode 13.1,iOS 15.0,这个问题仍然存在。幸运的是,这个解决方案也是如此。
    【解决方案2】:

    尝试通过以下方式实现:

    - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    
        return CGSizeMake(70, 60);
    }
    
    - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
        return UIEdgeInsetsMake(0, 0, 0, 0);
    }
    

    并设置collection view的流式布局:

    -(void)setCollectionViewLayout {
    
    UICollectionViewFlowLayout *flow = [[UICollectionViewFlowLayout alloc] init];
    flow.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    flow.minimumInteritemSpacing = 5;
    flow.minimumLineSpacing = 5;
    
    [yourCollectionview setCollectionViewLayout:flow];
    

    }

    注意:我的收藏视图具有恒定的高度。

    【讨论】:

    【解决方案3】:

    如果您不需要在集合视图内设置尾随空格,请设置 minimumInteritemSpacing = 0(或在滚动结束时适合您的集合设计的一些较小值)。

    对于垂直滚动的网格,minimumInteritemSpacing 值表示同一行中项目之间的最小间距。

    对于水平滚动的网格,minimumInteritemSpacing 值表示同一列中项目之间的最小间距。

    minimumInteritemSpacing间距用于计算一行可以放多少个项目,但在确定项目数后,实际间距可能会向上调整。

    有关更多信息,请参阅 Apple 开发者文档:minimumInteritemSpacing

    【讨论】:

    • 我这样做时会出现问题 - 项目不会在一行中对齐 :( 在这里查看:pasteboard.co/MVOX44fyc.png
    • 我开始使用该值的原因是强制项目(尽管它们的大小)排成一行。
    • 对于水平滚动方向,一般所有单元格,对齐到同一行,minimumInterItem 空间也设置单元格和collectionview的尾随内侧之间的水平距离,因此它可能不会干扰单元格的水平对齐。但是,您面临一个问题。如果临时空间 = 0,您能否分享有关您的收藏视图代码和屏幕截图的更多详细信息
    • 这是屏幕截图 - 集合视图高度为 130,项目为 20 像素:pasteboard.co/MVOX44fyc.png 这是我摆脱间距值的时候
    • 您的问题可能与集合视图的流程布局委托方法有关。如果您已经实现,请分享它的代码。 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
    【解决方案4】:

    collectionViewLayout 的解决方案 这是由组的宽度/高度设置为绝对/小数引起的。使滚动面达到估计值。

        NSCollectionLayoutSize(widthDimension: .estimated(1.0), 
                               heightDimension: .fractionalHeight(1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-27
      • 2019-04-20
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      相关资源
      最近更新 更多