UICollectionView 的问题 iOS8

Problems with UICollectionView iOS8

所以我遇到了一个我认为应该超级简单的最奇怪的问题。这是我的 collectionView

所以..如您所见,右图被截掉了。现在这是奇怪的部分。这是我的 cellForItemAtIndexPath 方法:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];

    UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 164, 164)]; // 0 0 164 141
    [cell.contentView addSubview:imageView];
    imageView.image = usersPhotos[indexPath.row];

    return cell;
}

这是我的故事板文件中的 UICollectionView

注意 我在故事板文件中的 collectionViewCell 是 155 x 155,我的 imageView 是 164x164。我这样做是因为出于某种原因我无法弄清楚:

将我的 imageView 设置为 155x155(与单元格大小相同),我们得到如下所示的内容:

那么我做错了什么?很明显我不想要那个白色间距(如上所示)并且我不能再扩展我的 UICollectionViewCell 因为 155 是最大宽度,出于某种原因在故事板上如果你达到 156 的宽度它会使单元格占据整个列, 没有空间容纳第二列,这正是我需要的。

我怎样才能简单地完成这项工作?非常感谢任何帮助,我很迷茫为什么我会遇到这种行为以及我做错了什么。

现在,您的单元格大小已硬编码在情节提要中,您必须使其动态变化,以便它根据您的应用 运行 在哪个设备上发生变化。

您必须实现 UICollectionViewFlowLayoutDelegate 方法,如下所示:

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return CGSizeMake(collectionView.frame.size.width/2, collectionView.frame.size.width/2);
}

您的单元格将需要根据设备的大小以及部分插入和项目间间距调整大小。

在 Storyboard 中,确保在 Collection View 的 Attributes Inspector 中选择了 Flow layout。

然后,执行 sizeForItemAtIndexPath 并计算部分插图:

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    // Get the flow layout properties
    UICollectionViewFlowLayout *flowLayout = ((UICollectionViewFlowLayout*)collectionViewLayout);

    // Calculate the usable width for the cell
    CGFloat usableWidth = collectionView.frame.size.width - flowLayout.sectionInset.left - flowLayout.sectionInset.right - flowLayout.minimumInteritemSpacing;

    // Return the proper size
    return CGSizeMake(usableWidth / 2, usableWidth / 2);

}

在你的故事板中展开你的视图控制器,然后 select "Collection View Flow Layout" 像这样:

然后在尺寸检查器中找到最小间距,如下所示:

将 "For Cells" 间距更改为 0。这将允许您在单元格之间没有任何间距地容纳单元格,并将单元格大小增加到最大 160(对于 320 的屏幕宽度)。

这将我的故事板布局从这个更改为单元格大小为 160w 的这个:

然后当我 运行 应用程序时,所有单元格都在接触: