等间距的UICollectionView单元格

大多数iOS开发人员使用UICollectionView,并且应内置等距单元

问题

苹果的iOS类UICollectionView和UICollectionViewFlowLayout被许多应用程序开发人员使用,并且大多数情况下这些类可以很好地协同工作,不需要太多的自定义,但是它们做得不好的一件事是自动为所有设备布局分配单元格。

在开发负责显示大型组织的REST服务的照片缩略图的应用程序时,我发现了这个问题。 使用默认值,甚至使用稍微调整的值,我的布局看起来都类似于以下屏幕截图。

虽然单元格之间的水平空白可能很好,但垂直空白要么不存在,要么与水平空白不一致; 同样,在屏幕边缘周围留有一些空白也很好。 可以调整这些值,但是对于每个设备和方向,每个值可以不同。 当前,Xcode的Interface Builder编辑器和UICollectionViewFlowLayout类都没有提供自动设置这些值的方法。

解决方案

为了解决这个问题,我写了一个UICollectionViewFlowLayout的子类DSSCollectionViewFlowLayout,它重写了prepareLayout方法以计算属性minimumLineSpacing,minimumInteritemSpacing和sectionInset所需的值,因此每当用户更改设备的方向或布局时,它们都具有相同的值。应用程序。 进行此更改后,每个单元格周围的空白区域将变得更加令人愉悦。

尽管每个单元周围的空白空间在设备和方向上都不同,但是在特定布局内,空白空间是一致的。

在为Apple平台开发软件时,与编写源代码相比,我更喜欢在故事板和XIB / NIB中尽可能多地添加设置,因此我决定将属性placeEqualSpaceAroundAllCells添加到我的子类中,以便可以在集合视图的内部打开或关闭此功能。资源“身份检查器”面板。

我的子类DSSCollectionViewFlowLayout的Objective-C标头声明了属性placeEqualSpaceAroundAllCells,因此我的prepareLayout版本将知道是否执行等距的空白计算。

子类的prepareLayout实现的Objective-C源代码显示了如何计算水平或垂直滚动​​的正确空间。

而且,为了好玩,我也写了一个Swift版本。

我目前仅将此代码用于正方形和矩形固定大小的单元格,但它也应与可变大小的单元格的集合视图一起使用。