iOS。 具有Swift泛型的通用单元
首先,我们必须承认在设计上不可能使用UITableViewCell而不是UICollectionViewCell,反之亦然。 因此,最好创建一些可以代替这两个类使用的东西。
UIView是一个很好的起点,因为它是UIKit中最通用的UI组件。 屏幕上显示的所有内容都可以使用它来创建。 我们可以将其放在表或集合单元中,作为其他所有内容的容器。 让我们从这个简单的想法开始。
第一次尝试
您可以看到其中具有任何视图的集合单元。
在这里以及我们进一步假设,很容易为表单元格创建相同的版本,并且省略了这种实现而不重复代码并减少读取时间的实现。
尽管单元格变得更加通用,但是这种方法给我们带来了一些缺点:
- 我们失去了标准单元的重用,需要自己创建视图池。 这意味着使用UIKit库进行代码复制;
- 使用xib更加困难,因为我们需要将所有内容都嵌入到视图中。
- 有一个恒定的视图类型,因此我们每次使用视图时都需要强制转换类型。
- 视图的框架严格限制为与单元格内容相同。
我们将使用Swift Generics对其进行进一步修复。
第二次尝试
作为第二种方法,我们对之前的代码进行了一些更改:
- 首先,如果我们要使用系统的重用,则单元格内部的视图不应更改。 这意味着我们将该属性标记为常量,并在单元初始化期间创建一个视图。
- 其次,让我们使用Swift Generics到处都知道视图类型。
现在看起来好多了。 但是我们仍然需要讨论有关从xib加载的大问题。
您通常需要一个xib名称,有时还需要一个束名称(对于框架而言)才能从xib加载某些内容。 如果xib与视图的类存储在同一束中,则xib名称足以加载视图,因为可以使用Bundle(for:Class)方法从该类接收束名称。
这是需要提供名称的协议LoadableFromXib ; 以及从xib文件加载视图的load方法的实现。
现在,在单元初始化期间从xib加载任何视图要容易得多。 看一下LoadableFromXibContentCollectionCell类中的视图初始化:
因此,现在我们可以使用任何视图创建集合(和表)单元,或者使用初始化程序创建它或从xib加载它。 系统对这些单元的重用( 任何视图)都是免费的。
最后,为了使解决方案更通用,让我们在视图中添加插图,因为单元已负责视图的定位和大小调整。 注意,在单元重用期间必须将内容插图恢复为零。
当然,可以向通用单元格添加更多属性,但是看起来contentInsets属性就足够了,因为通用单元格只负责在其内部定位视图。
总而言之,我们创建了具有以下功能的通用单元:
- 任何视图都可以轻松地转换为表单元格或集合单元,无论它是从xib加载还是以编程方式创建。 例如: SimpleContentCollectionCell -是包含标签的集合单元。
- 视图填充或边距不会发生变化,因为可以使用像这样的单元格的contentInsets参数来固定它们: cell.contentInsets.left = 20-从左侧增加20个点的插图。
- 在单元格上设置一些值时,我们确实知道该单元格的视图类型: cell.view.text =“单元格文本”
我已经发布了这篇文章,以分享一些Swift代码中的有用方法。 希望这会有所帮助。 此外,我们非常欢迎您评论和讨论该方法,并在您的项目中使用它。 另外,请随时下载游乐场以显示桌子高亮状态等:Universal Cells游乐场。
感谢您的阅读!
- 如何让我的AVPlayer在应用程序在后台播放?
- 一起使用AVCaptureSession和AVAudioPlayer
- 当用户按下button显示dateselect器视图和selectdate,然后显示为button标题和进一步closuresdateselect器视图
- 将NSDate转换为mm / dd / yyyy
- 什么时候应该使用__bridge与CFBridgingRelease / CFBridgingRetain?
- UICollectionView VS UITableview
- 使用NSLayoutAnchor删除情节提要
- 面料js自定义旋转图标只在iPhone的谷歌浏览器中不可见
- 形成一个谓词来过滤date之间