【问题标题】:Setting size of UICollectionViewCell in a way that there is no interim spacing in between以没有中间间距的方式设置 UICollectionViewCell 的大小
【发布时间】:2015-03-06 11:44:26
【问题描述】:

我正在使用UICollectionView,我想在其上并排放置七个单元格。应该为此使用整个屏幕。目前,我正在使用集合视图的宽度并将其除以七。现在我在 iPhone 4 上获得了 45.71429 的项目宽度。在一些单元格之间有一个临时间距。我该如何处理?我想填满整个屏幕,所有项目都应该有相同的大小。

我想到的一个选择是将值四舍五入并将剩余的值用作插图。但是没有更好的方法吗?

【问题讨论】:

  • 您可以使用整数值作为单元格的宽度,计算加分并使用流布局将其应用于其中一个单元格
  • @ZaidPathan:我试过了。我以为我可以在单元格之间不使用间距,但似乎不可能。
  • @aquarium_moose:但是到哪个牢房?单元格应具有相同的大小。我发现的唯一方法是在外面设置一个插图。
  • @testing,您可以在所有单元格之间传播,差异只有 1 点,没有人会看到它)插入很好的解决方案,但无论如何它们也会有所不同

标签: ios uicollectionview uicollectionviewcell uicollectionviewlayout spacing


【解决方案1】:

第 1 步: 实施 UICollectionViewDelegateFlowLayout(如果未完成)。

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

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

第 3 步:转到您拥有 CollectionView 的 XIB 或 StoryBoard

第 4 步:在您拥有 CollectionView 的 XIB 或 StoryBoard 中,点击 CollectionView。

第 5 步: 转到 InterfaceBuilder,然后在倒数第二个选项卡(即:Size Inspector)中设置 Min Spacing

对于单元格 = 0

对于线 = 0

那个。

【讨论】:

  • 我假设 minimumLineSpacingminimumInteritemSpacing 与您编写的 Cells/Lines = 0 相同。我在代码中创建了 CollectionView。单元格之间的间距在模拟器中似乎有所不同。
  • 这可能是 AutoLayout 的问题,您是否对单元格宽度设置了约束?
  • 我正在使用一个标签,该标签使用自动布局定位在单元格的中间。但我没有对单元格宽度使用自动布局。
  • 那么该标签的宽度是多少。?它的宽度是固定的还是你已经固定了?
  • 它应该是内在的内容大小。我只使用 center X 和 center Y 作为自动布局约束来定位它。现在我尝试不添加具有相同结果的标签。间距不是整数值。我认为这就是发生这种情况的原因。
【解决方案2】:

试试这个!

最重要的是,将UICollectionViewDelegateFlowLayoutUICollectionViewDelegate 添加到您的控制器中

针对您的单元格大小为insetsizeForItem 实施以下方法。

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsetsMake(0, 0, 0, 0)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    // Here, I need 3 equal cells occupying whole screen width so i divided it by 3.0. You can use as per your need.
    return CGSize(width: UIScreen.main.bounds.size.width/3.0, height: UIScreen.main.bounds.size.width/3.0)                
}

对于单元格之间的 0 间距,我们需要像这样指定它的布局。

let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 0
self.collectionView!.collectionViewLayout = layout

谢谢。希望这会有所帮助!

【讨论】:

    【解决方案3】:

    正如您已经发现的那样,将 320 点宽的屏幕分成 7 等份是不可能的。

    但是,如果一个单元格比另一个单元格大或小半个甚至一个点,没人会注意到。您可以使用一点数学来获得整数像素值(即 0.5 点)。

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        var size: CGSize!
        let column = indexPath.item % 7
        let width = collectionView.bounds.size.width
        let height = 80.0
    
        if width == 320.0 {
            // iPhone 5
            // 46 + 0,5 + 45 + 0,5 + 45 + 0,5 + 45 + 0,5 + 45 + 0,5 + 45 + 0,5 + 46
            if column == 0 || column == 6 {
                size = CGSize(width: 46, height: height)
            }
            else {
                size = CGSize(width: 45, height: height)
            }
        }
        else if width == 375.0 {
            // iPhone 6
            // 53 + 0,5 + 53 + 0,5 + 53 + 0,5 + 54 + 0,5 + 53 + 0,5 + 53 + 0,5 + 53
            if column == 3 {
                size = CGSize(width: 54, height: height)
            }
            else {
                size = CGSize(width: 53, height: height)
            }
        }
        else if width == 414.0 {
            // iPhone 6 Plus
            // 58 + 0,5 + 59 + 0,5 + 59 + 0,5 + 59 + 0,5 + 59 + 0,5 + 59 + 0,5 + 58
            if column == 0 || column == 6 {
                size = CGSize(width: 58, height: height)
            }
            else {
                size = CGSize(width: 59, height: height)
            }
        }
        else {
            println("Unhandled Width: \(width)")
            abort()
        }
        return size
    }
    

    这只是一个示例,我已经准备好了,因为我目前正在处理日历视图。每个单元格之间有 1 个像素的间距。 对于没有间距的 320 pt 宽的单元格布局,您可以使用类似 45.5+45.5+46+46+46+45.5+45.5

    【讨论】:

    • 哇!最小间距!我建议不要中止使用size=width/7。我在这里可以看到的唯一缺点是,如果引入了新的屏幕宽度并且您必须针对每个屏幕(例如 iPad)进行调整。但我认为这是尽可能接近的。
    • 是的,在生产代码中应该将else { abort() } 替换为width / 7。它可能看起来很难看,但只有在您发布下一个更新之前。
    • 还要补充一点:在方向更改时,您还必须像示例中一样指定尺寸。
    【解决方案4】:

    试试这个, 声明这些变量

      NSInteger insets_Top=5;
      NSInteger insets_Bottom=5;
      NSInteger insets_Left=5;
      NSInteger insets_Right=5; 
    

    并添加这些方法

     - (CGSize)collectionView:(UICollectionView *)collectionView layout:   (UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:   (NSIndexPath *)indexPath
    {
        CGRect screenRect = [[UIScreen mainScreen] bounds];
        CGFloat screenWidth = screenRect.size.width;
        CGSize img_size=CGSizeMake(screenWidth/num_items-   (insets_Right+insets_Left), screenWidth/num_items);
        return img_size;
    }
    
      - (UIEdgeInsets)collectionView:
     (UICollectionView *)collectionView layout:  (UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:  (NSInteger)section
       {
          return    UIEdgeInsetsMake(insets_Top,insets_Left,insets_Bottom,insets_Right);
       }
    

    这里 num_items=7 在您的情况下,您希望一行中的单元格数为 7

    【讨论】:

    • 我必须使用num_items=6 才能连续获得七个单元格。第二个参数不应该是 img_size 的 screenHeight 吗?如我所见,单元格之间仍然有间距。这是唯一的方法吗?
    • 否,连续获取 7 个单元格 num_items=7 ;是的,如果您不想要方形单元格,第二个参数可以是 screenHeight。
    • 我将minimumLineSpacingminimumInteritemSpacing 设置为零。也许这就是他让我多看一个细胞的原因。
    猜你喜欢
    • 2018-07-08
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多