Classes
The following classes are available globally.
-
An instance of
See moreIGListBatchUpdateData
takes section indexes and item index paths and performs cleanup on init in order to perform a crash-free update via-[UICollectionView performBatchUpdates:completion:]
.Declaration
Objective-C
@interface IGListBatchUpdateData : NSObject
Swift
class ListBatchUpdateData : NSObject
-
A result object returned when diffing with sections.
See moreDeclaration
Objective-C
@interface IGListIndexPathResult : NSObject
Swift
class ListIndexPathResult : NSObject
-
A result object returned when diffing with indexes.
See moreDeclaration
Objective-C
@interface IGListIndexSetResult : NSObject
Swift
class ListIndexSetResult : NSObject
-
An object representing a move between indexes.
See moreDeclaration
Objective-C
@interface IGListMoveIndex : NSObject
Swift
class ListMoveIndex : NSObject
-
An object representing a move between indexes.
See moreDeclaration
Objective-C
@interface IGListMoveIndexPath : NSObject
Swift
class ListMoveIndexPath : NSObject
-
IGListAdapter
objects provide an abstraction for feeds of objects in aUICollectionView
by breaking each object into individual sections, called “section controllers”. These controllers (objects subclassing toIGListSectionController
) act as a data source and delegate for each section.Feed implementations must act as the data source for an
See moreIGListAdapter
in order to drive the objects and section controllers in a collection view.Declaration
Objective-C
@interface IGListAdapter : NSObject
Swift
class ListAdapter : NSObject
-
An
IGListAdapterUpdater
is a concrete type that conforms toIGListUpdatingDelegate
. It is an out-of-box updater forIGListAdapter
objects to use.Note
This updater performs re-entrant, coalesced updating for a list. It also uses a least-minimal diff for calculating UI updates whenIGListAdapter
calls-performUpdateWithCollectionView:fromObjects:toObjects:completion:
.Declaration
Objective-C
@interface IGListAdapterUpdater : NSObject <IGListUpdatingDelegate>
Swift
class ListAdapterUpdater : NSObject, ListUpdatingDelegate
-
This section controller uses a data source to transform its “top level” object into an array of diffable view models. It then automatically binds each view model to cells via the
IGListBindable
protocol.Models used with
IGListBindingSectionController
should take special care to always returnYES
for identical objects. That is, any objects with matching-diffIdentifier
s should always be equal, that way the section controller can create new view models via the data source, create a diff, and update the specific cells that have changed.In Objective-C, your
-isEqualToDiffableObject:
can simply be:- (BOOL)isEqualToDiffableObject:(id)object { return YES; }
In Swift:
func isEqual(toDiffableObject object: IGListDiffable?) -> Bool { return true }
Only when
See more-diffIdentifier
s match is object equality compared, so you can assume the class is the same, and the instance has already been checked.Declaration
Objective-C
@interface IGListBindingSectionController< __covariant ObjectType : id <IGListDiffable>> : IGListSectionController
Swift
class ListBindingSectionController<ObjectType> : ListSectionController where ObjectType : ListDiffable
-
Special section controller that only contains a single item, and it will apply the view model update during -didUpdateObject: call, usually happened inside -[UICollectionView performBatchUpdates:completion:].
This class is intended to be subclassed.
See moreDeclaration
Objective-C
@interface IGListBindingSingleSectionController< __covariant ViewModel : id <IGListDiffable>, Cell : UICollectionViewCell *> : IGListSectionController
Swift
class ListBindingSingleSectionController<ViewModel, Cell> : ListSectionController where ViewModel : ListDiffable, Cell : UICollectionViewCell
-
This
UICollectionView
subclass allows for partial layout invalidation usingIGListCollectionViewLayout
, or custom layout classes that conform to IGListCollectionViewLayoutCompatible.Note
When updating a collection view (ex: calling-insertSections
),-invalidateLayoutWithContext
gets called on the layout object. However, the invalidation context doesn’t provide details on which index paths are being modified, which typically forces a full layout re-calculation.IGListCollectionView
givesIGListCollectionViewLayout
the missing information to re-calculate only the modified layout attributes.Declaration
Objective-C
@interface IGListCollectionView : UICollectionView
Swift
class ListCollectionView : UICollectionView
-
This UICollectionViewLayout subclass is for vertically or horizontally scrolling lists of data with variable widths and heights. It supports an infinite number of sections and items. All work is done on the main thread, and while extremely efficient, care must be taken not to stall the main thread in sizing delegate methods.
This layout piggybacks on the mechanics of UICollectionViewFlowLayout in that:
- Your UICollectionView data source must also conform to UICollectionViewDelegateFlowLayout
- Header support given via UICollectionElementKindSectionHeader
All UICollectionViewDelegateFlowLayout methods are required and used by this layout:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section; - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section; - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section; - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;
In a vertically scrolling layout, sections and items are put into the same horizontal row until the max-x position of an item extends beyond the width of the collection view. When that happens, the item is “newlined” to the next row. The y position of that row is determined by the maximum height (including section insets) of the section/item of the previous row.
Ex. of a section (2,0) with a large width causing a newline.
|[ 0,0 ][ 1,0 ] | |[ 2,0 ]|
A section with a non-zero height header will always cause that section to newline. Headers are always stretched to the width of the collection view, pinched with the section insets.
Ex. of a section (2,0) with a header inset on the left/right.
|[ 0,0 ][ 1,0 ] | | >======header=======< | | [ 2,0 ] |
Section insets apply to items in the section no matter if they begin on a new row or are on the same row as a previous section.
Ex. of a section (2) with multiple items and a left inset.
|[ 0,0 ][ 1,0 ] >[ 2,0 ]| | >[ 2,1 ][ 2,2 ][ 2,3 ]|
Interitem spacing applies to items and sections within the same row. Line spacing only applies to items within the same section.
In a horizontally scrolling layout, sections and items are flowed vertically until they need to be “newlined” to the next column. Headers, if used, are stretched to the height of the collection view, minus the section insets.
Please see the unit tests for more configuration examples and expected output.
See moreDeclaration
Objective-C
@interface IGListCollectionViewLayout : UICollectionViewLayout <IGListCollectionViewLayoutCompatible>
Swift
class ListCollectionViewLayout : UICollectionViewLayout, ListCollectionViewLayoutCompatible
-
This class adds a helper layer to
See moreIGListSectionController
to automatically store a generic object indidUpdateToObject:
.Declaration
Objective-C
@interface IGListGenericSectionController<__covariant ObjectType> : IGListSectionController
Swift
class ListGenericSectionController<ObjectType> : ListSectionController where ObjectType : AnyObject
-
An
IGListReloadDataUpdater
is a concrete type that conforms toIGListUpdatingDelegate
. It is an out-of-box updater forIGListAdapter
objects to use.Note
This updater performs simple, synchronous updates using-[UICollectionView reloadData]
.Declaration
Objective-C
@interface IGListReloadDataUpdater : NSObject <IGListUpdatingDelegate>
Swift
class ListReloadDataUpdater : NSObject, ListUpdatingDelegate
-
The base class for section controllers used in a list. This class is intended to be subclassed.
See moreDeclaration
Objective-C
@interface IGListSectionController : NSObject
Swift
class ListSectionController : NSObject
-
This section controller is meant to make building simple, single-cell lists easier. By providing the type of cell, a block to configure the cell, and a block to return the size of a cell, you can use an
See moreIGListAdapter
-powered list with a simpler architecture.Declaration
Objective-C
@interface IGListSingleSectionController : IGListSectionController
Swift
class ListSingleSectionController : ListSectionController
-
Container object that holds the data needed for an update.
See moreDeclaration
Objective-C
@interface IGListTransitionData : NSObject
Swift
class ListTransitionData : NSObject