UICollectionView单元格间距基于设备屏幕大小

时间:2015-03-05 07:11:30

标签: ios xcode6 uicollectionview

我已经实现了一个UICollectionView,单元格大小为w90 h90。当我在iPhone 6上运行时,我在单元格之间获得了适当的间距,但是当我在iPhone 5s上运行时,我在单元格之间获得了更多的间距。 我的问题是如何根据设备屏幕大小更改单元格大小,假设如果单元格大小为w80 h80,我也会在iPhone 5s上获得正确的结果。我现在正在做的是

 override func viewWillAppear(animated: Bool) {

        var scale = UIScreen.mainScreen().scale as CGFloat
        println("Scale :\(scale)")

        var cellSize = (self.collectionViewLayout as UICollectionViewFlowLayout).itemSize
        println("Cell size :\(cellSize)")

        imageSize = CGSizeMake(cellSize.width * scale , cellSize.height * scale)
        println("Image size : \(imageSize)")

    }

// sizeForItemAtIndexPath

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

        return imageSize!

   }

iPhone 6上的结果: enter image description here

iPhone 5s的结果 enter image description here

Objective-C / Swift对解决方案都很好。 感谢。

5 个答案:

答案 0 :(得分:35)

步骤1:实施UICollectionViewDelegateFlowLayout(如果没有完成)。

第2步:使用UICollectionViewDelegateFlowLayout的委托方法。

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
return CGSizeMake((UIScreen.mainScreen().bounds.width-15)/4,120); //use height whatever you wants.
}

第3步:转到 XIB或StoryBoard ,在那里有CollectionView。

第4步: XIB或StoryBoard 中,您可以在CollectionView中单击CollectionView。

步骤5:转到InterfaceBuilder,然后在倒数第二个标签(即:尺寸检查器)中设置最小间距

对于Cells = 5

对于行= 5

它。

  

注意:

     
      
  • 如果您想在cell = 5 之间建立间距,则可以使用此解决方案。
  •   
  • 如果您的间距不同于 5 ,则需要在委托方法中更改值 15
  •   
  • 例如:单元格之间的间距= 10 ,然后将代理 15 更改为 10x3 = 30
  •   
     

return CGSizeMake((UIScreen.mainScreen().bounds.width-30)/4,120);

  • 并设置 Min Spacing
  

For Cells = 10

     

For Lines = 10

反之亦然。

Swift 3版本

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = UIScreen.main.bounds.width
    return CGSize(width: (width - 10)/3, height: (width - 10)/3) // width & height are the same to make a square cell
}

答案 1 :(得分:14)

稍微灵活的答案

允许您调整列数和间距,扩展Zaid Pathan的答案

// MARK: UICollectionViewDelegateFlowLayout delegate method
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
    let cellSpacing = CGFloat(2) //Define the space between each cell
    let leftRightMargin = CGFloat(20) //If defined in Interface Builder for "Section Insets"
    let numColumns = CGFloat(3) //The total number of columns you want

    let totalCellSpace = cellSpacing * (numColumns - 1)
    let screenWidth = UIScreen.mainScreen().bounds.width
    let width = (screenWidth - leftRightMargin - totalCellSpace) / numColumns
    let height = CGFloat(110) //whatever height you want

    return CGSizeMake(width, height);
}

答案 2 :(得分:2)

I wanted 3 item in a section in Both IPad and iPhone. I worked out using the following code. Hope it helps!

1 ) Implement UICollectionViewDelegateFlowLayout delegate


2 )  var device = UIDevice.currentDevice().model

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
    {
        if (device == "iPad" || device == "iPad Simulator")
        {
            return CGSizeMake((UIScreen.mainScreen().bounds.width-15)/3,230)
        }
        return CGSizeMake((UIScreen.mainScreen().bounds.width-10)/3,120)
    }

答案 3 :(得分:1)

Objective-c示例:

使用此功能

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
     return CGSizeMake(Your desired width, Your desired height);    
    // example: return CGSizeMake(self.view.frame.size.width-20, 100.f);
}

答案 4 :(得分:0)

要扩展Tim's answer,有一个与局部点宽度有关的小警告:部分点宽度的舍入可能会导致宽度宽于允许所需列数的宽度。解决此问题的一种方法是使用trunc():

截断宽度
 return CGSizeMake(trunc(width), height)