以没有中间间距的方式设置 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
那个。
【讨论】:
我假设minimumLineSpacing
和 minimumInteritemSpacing
与您编写的 Cells/Lines = 0 相同。我在代码中创建了 CollectionView。单元格之间的间距在模拟器中似乎有所不同。
这可能是 AutoLayout 的问题,您是否对单元格宽度设置了约束?
我正在使用一个标签,该标签使用自动布局定位在单元格的中间。但我没有对单元格宽度使用自动布局。
那么该标签的宽度是多少。?它的宽度是固定的还是你已经固定了?
它应该是内在的内容大小。我只使用 center X 和 center Y 作为自动布局约束来定位它。现在我尝试不添加具有相同结果的标签。间距不是整数值。我认为这就是发生这种情况的原因。【参考方案2】:
试试这个!
最重要的是,将UICollectionViewDelegateFlowLayout
和UICollectionViewDelegate
添加到您的控制器中
针对您的单元格大小为inset
和sizeForItem
实施以下方法。
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。
我将minimumLineSpacing
和minimumInteritemSpacing
设置为零。也许这就是他让我多看一个细胞的原因。以上是关于以没有中间间距的方式设置 UICollectionViewCell 的大小的主要内容,如果未能解决你的问题,请参考以下文章
WKInterfaceController,如何以编程方式设置“间距”和“插图”
如何在 UICollectionView 中实现页面之间的间距?