以没有中间间距的方式设置 UICollectionViewCell 的大小

Posted

技术标签:

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

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

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

【问题讨论】:

看这个,***.com/a/28872308/3411787 您可以使用整数值作为单元格的宽度,计算加分并使用流布局将其应用于其中一个单元格 @ZaidPathan:我试过了。我以为我可以在单元格之间不使用间距,但似乎不可能。 @aquarium_moose:但是到哪个牢房?单元格应具有相同的大小。我发现的唯一方法是在外面设置一个插图。 @testing,您可以在所有单元格之间传播,差异只有 1 点,没有人会看到它)插入很好的解决方案,但无论如何它们也会有所不同 【参考方案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 设置为零。也许这就是他让我多看一个细胞的原因。

以上是关于以没有中间间距的方式设置 UICollectionViewCell 的大小的主要内容,如果未能解决你的问题,请参考以下文章

可以在 gVim Editor 中以某种方式设置字母间距吗

WKInterfaceController,如何以编程方式设置“间距”和“插图”

如何在 UICollectionView 中实现页面之间的间距?

UICollection 的镜像滚动

Android RecyclerView使用GridLayoutManager间距设置

如何更改 RichTextBox 段落间距?