【问题标题】:UICollectionView cells not spacing at allUICollectionView 单元格根本没有间距
【发布时间】:2014-06-06 04:46:01
【问题描述】:

我有一个集合视图,它本身是委托和数据源,并且布局定义如下:

- (id)initWithCoder:(NSCoder *)aDecoder{ 
    self = [super initWithCoder:aDecoder];
    if (self){
        self.dataSource = self;
        self.delegate = self;
        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
        layout.minimumLineSpacing = 0;
        layout.sectionInset = UIEdgeInsetsMake(0, 8, 0, 8);
        layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        layout.footerReferenceSize = CGSizeMake(1, 70);
        layout.itemSize = CGSizeMake(60, 70);
        layout.minimumInteritemSpacing = 4.0f;
        [self setCollectionViewLayout:layout];
    }
    return self;
}

代码运行正常,除了 minimuminteritemspacing。

结果是一个集合视图,其中每个部分中的项目根本没有任何间距。

我设置的最小间距值应该向上调整,而不是向下调整,对吗?

那么为什么我看到的结果和这个屏幕上的一样呢? (我对每个收藏品进行了着色,以便清楚地看到没有间距)

更多细节,这里是我正在记录的帧,你可以看到第三个项目正好在第二个项目之后开始(145 像素 = 85(previousitem.x) + 60(previousitem.width)),没有间距.

2014-04-22 10:25:49.954 App[15172:60b] self <PhotoIndexCollectionViewCell: 0x16576630; baseClass = UICollectionViewCell; frame = (8 0; 60 70); layer = <CALayer: 0x165777a0>>

2014-04-22 10:25:49.955 App[15172:60b] self <PhotoIndexCollectionViewCell: 0x16578380; baseClass = UICollectionViewCell; frame = (85 0; 60 70); layer = <CALayer: 0x16578520>>

2014-04-22 10:25:49.955 App[15172:60b] self <PhotoIndexCollectionViewCell: 0x16586620; baseClass = UICollectionViewCell; frame = (145 0; 60 70); layer = <CALayer: 0x165866c0>>

我在这里误会了什么?

我什至尝试添加这个方法,它实际上是为每个部分调用的,但结果是一样的。

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
    return 4.0f;
}

【问题讨论】:

  • 请阅读此答案stackoverflow.com/questions/17229350/…。我想它会对你有所帮助。
  • 我试过了,但还是不行。我设置了至少 20 像素,看看是否会出现问题,但单元格仍然没有间距。

标签: ios uicollectionview cellspacing


【解决方案1】:

您可以使用以下Delegate 方法设置间距:

// Layout: Set cell size
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

 //    NSLog(@"SETTING SIZE FOR ITEM AT INDEX %ld", (long)indexPath.row);
       CGSize mElementSize = CGSizeMake(150, 36);
       return mElementSize;
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
       return 3.0;
}

 - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
      return 7.0;
  }

// Layout: Set Edges
 - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
   // return UIEdgeInsetsMake(0,8,0,8);  // top, left, bottom, right
      return UIEdgeInsetsMake(0,0,0,0);  // top, left, bottom, right
}

【讨论】:

  • 我已经实现了所有这些方法,当然还有我的价值观,但仍然没有结果。
  • 我接受您的回答,因为在我的情况下,由于 Interface Builder 中的错误,间距不起作用。所以实际上正确的方法当然是你指向的委托方法。谢谢
  • @Axy:错误是什么?我也面临同样的问题
【解决方案2】:

按照苹果文档中的说明,空间可能会向上调整 - 但看起来也可能向下调整。 老实说,我真的不明白为什么,现在也没有时间调查这个问题(我正面临这个问题,必须完成我的工作;)) - 这可能只是 Apple 布局中的一个错误,因为它呈现得如此简单

https://developer.apple.com/documentation/uikit/uicollectionviewflowlayout/1617706-minimuminteritemspacing?changes=latest_minor

无论如何,我看到了两种解决方法:

1 - 通过添加所有项目宽度(如果宽度不固定)或将其设置为( itemWidth + minimumSpace )* numberOfItems + minimumSpace (用于第一个填充)来计算集合容器边界(在 viewDidLayout 函数中?)

2 - 激进的方式(我选择的方式):我将单元格内容嵌入到按我想要的数量插入的视图中。它不能失败。

祝大家好运

【讨论】:

  • 有些地方不太对劲。你能告诉我文件在哪里说明单元格之间的空间可能小于要求的空间吗?这是一个 minimumInteritemSpacing 所以我希望它“不小于..”
  • 是的。我的不好……“这个间距是用来计算一行可以放多少个项目的,但是在确定了项目的数量之后,实际的间距可能会向上调整。” - 我错了,不是向下,而是向上。但是,我怀疑 Apple 布局中存在错误..
  • 我对我的答案进行了一些编辑 - 我希望它更清楚。 - 可以肯定的是,解决方案 2 速度很快,而且不会让人头疼。
猜你喜欢
  • 2015-05-01
  • 2013-06-18
  • 1970-01-01
  • 2013-03-09
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多