Table of contents
- Supports dynamic cells and supplementary view sizes.
- Animated insertion/deletion/reloading/moving of the items.
- Keeps content of the last visible item at the top or bottom of the
- Provides tools for precise scrolling to the required item.
- Shipped with generic container views to simplify the custom items implementation.
What ChatLayout doesn’t provide (And why it is good)
ChatLayout is the custom
You don’t have to extend or override any custom
UICollectionView. You need to instantiate them yourself and use them the way you like.
ChatLayoutdoes not rely on modified
UICollectionViewFlowLayoutnor does it rotate your
UICollectionViewupside-down. This means you can use your views as if they would be regular cells within
UICollectionView. You can benefit from using the default
adjustedContextInsets(and others) because your view controller is a normal view controller without any hacks or tricks.
ChatLayoutdoesn’t require you to calculate all the cell sizes before it renders them on the screen. You can fully use auto-layout constraints and rely on the fact that the correct size will be calculated in the runtime. However,
ChatLayoutas any other
UICollectionViewLayoutwill benefit from you providing the estimated sizes of your cells as it will allow you to get better performance.
ChatLayoutdoesn’t enforce you to use any specific data model. You can store your messages and update
UICollectionViewthe way you like. The only thing you need is to respect the natural boundaries that
UICollectionViewhave and correctly implement
UICollectionViewDataSource. The Example app uses DifferenceKit to process changes in the data model.
ChatLayoutdoesn’t enforce you to use any specific
UIViews to create your collection cells. You can create them the way you like. It can be any
UICollectionReusableView. There are some generic
UIViews bundled with the library that may help you to build them faster. However, you do not have to use them.
ChatLayoutdoesn’t handle the keyboard appearance behavior. You have to implement that yourself from scratch or use the library you are already using in your project. It gives you full control over the keyboard presentation. The only thing you have to do is to update the
To run the example project, clone the repo, and run
pod install from the Example directory first.
If you are using cocoapods you can install the whole package using
pod 'ChatLayout'. If you do not need the additional
components provided, you can install only the layout itself using
ChatLayout is in active development, and we welcome your contributions.
If you’d like to contribute to this repo, please read the contribution guidelines.
- [ ] Improve the test coverage
ChatLayout can process any update commands that you send to your
UICollectionView, so you can use
UICollectionViewDiffableDataSource as well. But you have to keep in mind that
does not support the reloading of cells out of the box if you are relying on the
Hashable protocol implementation.
It will delete the changed cell and insert the new version of said cell. That may lead to strange animations on
the screen, especially when the reloaded cell changes its size. In order to get the best behaviour of the update animation
I would strongly recommend you rely on DifferenceKit or a similar library
to process the model changes. The Example app does it as well.
About Supplementary Views
It can be tempting and it may look like it is the right way to go, but do not use supplementary views to decorate your
messages or groups of them.
UICollectionView processes them in a different order:
UICollectionViewCells first and
only after switches to
UICollectionReusableViews. You will most likely face some unexpected behaviour during the animation.
ChatLayout can be used together with Texture to improve the auto-layout performance.
But keep in mind that it’s default wrapper is hardcoded to work exclusively with
You will have to implement
ChatLayoutDelegate yourself and propagate the node size manually.
If you see a strange or unexpected animation during the updates, check your data model and the commands you send to the
performBatchUpdates. Especialy if you are using some diffing algorithms like DifferenceKit.
It is very possible that you are sending delete/insert commands when you expect to see reload. The easiest way to check it is by adding
ChatLayout doesn’t know what you expected to see.
It just processes your changes according to the commands it has received.
ChatLayout is provided for your use, free-of-charge, on an as-is basis. We make no guarantees, promises or
apologies. Caveat developer.
- My COVID-19 lockdown project or how I started to dig into a custom UICollectionViewLayout to get a ChatLayout
- Мой Covid-19 lockdown проект, или, как я полез в кастомный UICollectionViewLayout и получил ChatLayout
I am happy to answer any questions you may have. Just create a new issue.