ChatLayout 2.0.9

ChatLayout 2.0.9

Eugene Kazaev维护。



  • Eugene Kazaev

Websummit

ChatLayout

CI Status Release Version Documentation Codecov Codacy Badge Swift Package Manager Carthage compatible Swift 5.8 Platform iOS

目录

关于

ChatLayoutMessageKit 的替代方案。它使用自定义的 UICollectionViewLayout 来提供您对展示方式的全面控制,以及所有可用的 UICollectionView 工具。

特性

  • 支持动态单元格和补充视图大小。
  • 支持项目插入、删除、重新加载和移动的动画。
  • 在更新过程中保持最后一个可见项目的的内容在UICollectionView顶部或底部。
  • 提供精确滚动到所需项目的工具。
  • 附带通用容器视图,简化自定义项目的实现。

ChatLayout 不提供的内容(以及为什么这是好的)

ChatLayout 是自定义的 UICollectionViewLayout,所以

  • 您不需要扩展或覆盖任何自定义 UIViewControllerUICollectionView。您需要自己实例化它们并按您喜欢的任何方式使用它们。

  • ChatLayout 不依赖于修改过的 UICollectionViewFlowLayout,也不旋转您的 UICollectionView 上下颠倒。这意味着您可以使用视图,就像它们是 UICollectionView 中的常规单元格一样。您可以受益于使用默认的 UIKit 实现,如 adjustedContextInsets(以及其他),因为您是一个普通的视图控制器,没有任何技巧或工具。

  • ChatLayout 不要求您在它们在屏幕上渲染之前计算所有单元格的大小。您可以完全使用自动布局约束,并依赖于正确的尺寸将在运行时计算。然而,ChatLayout 如任何其他 UICollectionViewLayout 一样,会受益于您提供单元格的估计大小,因为它将允许您获得更好的性能。

  • ChatLayout 不强制您使用任何特定的数据模型。您可以按您喜欢的任何方式存储消息并更新 UICollectionView。唯一需要的是尊重 UICollectionView 的自然边界,并正确实现 UICollectionViewDataSource。示例应用程序使用 DifferenceKit 来处理数据模型中的更改。

  • ChatLayout 不强制您使用任何具体的 UIView 来创建您的收集单元格。您可以按您喜欢的任何方式创建它们。可以是任何 UICollectionViewCellUICollectionReusableView。库中包含一些通用的 UIView,可以帮助您更快地构建单元格。但是,您不必使用它们。

  • ChatLayout 不处理键盘出现的行为。您必须从头开始实现它或使用您项目已使用的库。它使您能够完全控制键盘呈现。您唯一要做的是更新 UICollectionViewcontentInsets

  • ChatLayout 不提供您任何输入控制。您可以选择您喜欢的任何一种,并根据自己的需求进行定制。例如,示例应用使用了 InputBarAccessoryView

示例

要运行示例项目,请先克隆存储库,然后从示例目录运行 pod install

安装

ChatLayout 可以通过 CocoaPodsCarthageSwiftPM 获取。有关使用详细信息,请参阅 示例 应用。

如果您使用 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 并手动传播节点大小。

关于动画

如果在更新期间看到奇怪的或意外的动画,请检查您的数据模型以及发送给UICollectionViewperformBatchUpdates命令。尤其是在您使用像DifferenceKit之类的差异算法时。您很可能在预期看到刷新时发送了删除/插入命令。检查的最简单方法是将print("\(updateItems)")添加到ChatLayout.prepare(forCollectionViewUpdates:)方法中。ChatLayout不知道您期望看到什么。它只是根据收到的命令处理您的更改。

关于粘性头部或脚部

粘性头部或脚部不受ChatLayout支持,但我们欢迎您的贡献。

许可证

ChatLayoutMIT许可证下分发。

ChatLayout免费提供给您的使用,按现状提供。我们不做保证、承诺或歉意。开发者请注意。

文章

英语

俄语

赞助此项目

如果您认为这个库很有用,特别是在生产中使用它,请考虑在这里赞助此项目。我在业余时间工作于 ChatLayout,您的赞助将帮助我继续开发和为开源社区做出贡献。您的支持将使我能够投入更多的时间和资源来开发此项目,确保它在未来多年都保持最新和相关。

感谢您的考虑!

作者

Evgeny Kazaev,[email protected]。Twitter ekazaev

我很乐意回答您可能有的任何问题。只需创建一个新问题