ChatLayout
目录
关于
ChatLayout
是 MessageKit 的替代方案。它使用自定义的 UICollectionViewLayout
来提供您对展示方式的全面控制,以及所有可用的 UICollectionView
工具。
特性
- 支持动态单元格和补充视图大小。
- 支持项目插入、删除、重新加载和移动的动画。
- 在更新过程中保持最后一个可见项目的的内容在
UICollectionView
顶部或底部。 - 提供精确滚动到所需项目的工具。
- 附带通用容器视图,简化自定义项目的实现。
ChatLayout 不提供的内容(以及为什么这是好的)
ChatLayout
是自定义的 UICollectionViewLayout
,所以
-
您不需要扩展或覆盖任何自定义
UIViewController
或UICollectionView
。您需要自己实例化它们并按您喜欢的任何方式使用它们。 -
ChatLayout
不依赖于修改过的UICollectionViewFlowLayout
,也不旋转您的UICollectionView
上下颠倒。这意味着您可以使用视图,就像它们是UICollectionView
中的常规单元格一样。您可以受益于使用默认的UIKit
实现,如adjustedContextInsets
(以及其他),因为您是一个普通的视图控制器,没有任何技巧或工具。 -
ChatLayout
不要求您在它们在屏幕上渲染之前计算所有单元格的大小。您可以完全使用自动布局约束,并依赖于正确的尺寸将在运行时计算。然而,ChatLayout
如任何其他UICollectionViewLayout
一样,会受益于您提供单元格的估计大小,因为它将允许您获得更好的性能。 -
ChatLayout
不强制您使用任何特定的数据模型。您可以按您喜欢的任何方式存储消息并更新UICollectionView
。唯一需要的是尊重UICollectionView
的自然边界,并正确实现UICollectionViewDataSource
。示例应用程序使用 DifferenceKit 来处理数据模型中的更改。 -
ChatLayout
不强制您使用任何具体的UIView
来创建您的收集单元格。您可以按您喜欢的任何方式创建它们。可以是任何UICollectionViewCell
或UICollectionReusableView
。库中包含一些通用的UIView
,可以帮助您更快地构建单元格。但是,您不必使用它们。 -
ChatLayout
不处理键盘出现的行为。您必须从头开始实现它或使用您项目已使用的库。它使您能够完全控制键盘呈现。您唯一要做的是更新UICollectionView
的contentInsets
。 -
ChatLayout
不提供您任何输入控制。您可以选择您喜欢的任何一种,并根据自己的需求进行定制。例如,示例应用使用了 InputBarAccessoryView。
示例
要运行示例项目,请先克隆存储库,然后从示例目录运行 pod install
。
安装
ChatLayout
可以通过 CocoaPods、Carthage 和 SwiftPM 获取。有关使用详细信息,请参阅 示例
应用。
如果您使用 Cocoapods,您可以使用 pod 'ChatLayout'
命令安装整个包。如果不需要提供的附加组件,您可以使用 pod 'ChatLayout/Core'
仅安装布局本身
贡献
ChatLayout
正在积极开发中,我们欢迎您的贡献。
如果您想为这个存储库做出贡献,请阅读 贡献指南。
待办事项
- 提高测试覆盖率
UICollectionViewDiffableDataSource
关于 ChatLayout
可以处理您发送给 UICollectionView
的任何更新命令,因此您可以同时使用 UICollectionViewDiffableDataSource
。但您必须记住,如果依赖 Hashable
协议实现,则 UICollectionViewDiffableDataSource
默认不支持重载单元格。它会删除已更改的单元格并插入该单元格的新版本。这可能导致屏幕上出现奇特的动画,尤其是当重载的单元格更改大小的时候。为了获得最佳更新动画效果,强烈建议您依赖于 DifferenceKit 或类似库来处理模型更改。示例应用程序也这样做。
关于辅助视图
可能会有吸引力,看起来也可能是一条正确的道路,但 不要 使用辅助视图来装饰您的消息或它们的一组。UICollectionView
会以不同的顺序处理它们:首先是 UICollectionViewCell
,然后才切换到 UICollectionReusableView
。您很可能会在动画期间遇到一些意外的行为。
关于 Texture
ChatLayout
可以与 Texture 一起使用以提高自动布局性能。但请注意,它默认的封装器被硬编码为仅与 UICollectionViewFlowLayout
一起工作。请参见issues/1959。[查看问题](https://github.com/TextureGroup/Texture/issues/1959)。您将需要自己实现 ChatLayoutDelegate
并手动传播节点大小。
关于动画
如果在更新期间看到奇怪的或意外的动画,请检查您的数据模型以及发送给UICollectionView
的performBatchUpdates
命令。尤其是在您使用像DifferenceKit之类的差异算法时。您很可能在预期看到刷新时发送了删除/插入命令。检查的最简单方法是将print("\(updateItems)")
添加到ChatLayout.prepare(forCollectionViewUpdates:)
方法中。ChatLayout
不知道您期望看到什么。它只是根据收到的命令处理您的更改。
关于粘性头部或脚部
粘性头部或脚部不受ChatLayout
支持,但我们欢迎您的贡献。
许可证
ChatLayout
在MIT许可证下分发。
ChatLayout
免费提供给您的使用,按现状提供。我们不做保证、承诺或歉意。开发者请注意。
文章
英语
俄语
赞助此项目
如果您认为这个库很有用,特别是在生产中使用它,请考虑在这里赞助此项目。我在业余时间工作于 ChatLayout
,您的赞助将帮助我继续开发和为开源社区做出贡献。您的支持将使我能够投入更多的时间和资源来开发此项目,确保它在未来多年都保持最新和相关。
感谢您的考虑!
作者
Evgeny Kazaev,[email protected]。Twitter ekazaev
我很乐意回答您可能有的任何问题。只需创建一个新问题。