仅显示两列,使用故事板在CollectionView中显示多行

时间:2016-07-15 11:17:25

标签: ios storyboard uicollectionview uicollectionviewcell

无论iPhone的屏幕尺寸是多少,我都想连续显示两个单元格。喜欢, End result required

我的故事板包含一个select * from t where box '((1,10),(5,10))' @> mypoint ,由约束连接。

Storyboard preview

UICollectionView的情节提要设置是, enter image description here

现在,当我在6,5s或更低版本中运行时,只有一个单元格出现在一行中。我使用的代码是,

UICollectionView

我尝试使用代码

以编程方式检测屏幕大小并指定适当的单元格大小
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return [categoryImages count];
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    homePageCells *cell = (homePageCells *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cells" forIndexPath:indexPath];
    cell.categoryName.text = [categoryNames objectAtIndex:indexPath.row];

    return cell;
}

但我也知道这不是正确的方法,所以请给我一个正确的方法来解决这个问题。

4 个答案:

答案 0 :(得分:51)

您无需检查设备大小,因为我们可以使用collectionView宽度来计算单元格的宽度。使用单元格宽度,您可以根据需要计算高度。

还有一件事:您需要使用UICollectionViewDelegateFlowLayout&确认代表和实施方法

  func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

   let padding: CGFloat =  50
   let collectionViewSize = collectionView.frame.size.width - padding

   return CGSizeMake(collectionViewSize/2, collectionViewSize/2)

}

更新:Swift 4.0

  func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let padding: CGFloat =  50
        let collectionViewSize = collectionView.frame.size.width - padding

        return CGSize(width: collectionViewSize/2, height: collectionViewSize/2)
    }

注意:我已经回答了问题,考虑到单元格是正方形的

答案 1 :(得分:9)

Xcode 8:Swift 3

我知道这是一个较老的问题,但我发现了一些接受答案的问题。

我必须使用 UICollectionViewDelegateFlowLayout ,而不是 CollectionViewFlowLayout

然后

其中'Padding'是Int类型,当你尝试从变量collectionViewSize中减去它时,它会抛出一个错误,因为它们是不同的类型。但是很容易修复。

我刚刚添加:CGFloat到行

最后,尽管可能有更好的方法,但我必须通过调整collectionView前导和尾随约束来匹配填充。

所有这一切都是我的代码最终看起来像

extension LandingPageViewController: UICollectionViewDelegateFlowLayout {

  func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let padding: CGFloat = 25
    let collectionCellSize = collectionView.frame.size.width - padding

  return CGSize(width: collectionCellSize/2, height: collectionCellSize/2)

   }

}

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我遇到传递给sizeForItemAtIndexPath的collectionView的边界在那个时刻不正确的问题。

对此的一个解决方法是重新加载viewWillAppear中的单元格以确保collectionView的边界正确。

另一种方法是使用UIScreen类。

-(instancetype)init: {
    self = [super init];
    if (self) {
        width = [[UIScreen mainScreen] bounds].size.width;
    }
    return self;
}

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

    // Two columns with spacing in between
    CGFloat size = ((width / 2) - (kSpacing * 2));
    return CGSizeMake(size, size);

}

在这种情况下,我将委托实例化为一个单独的类(因此是init),但它可以像扩展一样容易地完成。