diff --git a/Source/ASCollectionNode+Beta.h b/Source/ASCollectionNode+Beta.h index 63aa0890..788d60fd 100644 --- a/Source/ASCollectionNode+Beta.h +++ b/Source/ASCollectionNode+Beta.h @@ -16,6 +16,13 @@ NS_ASSUME_NONNULL_BEGIN @interface ASCollectionNode (Beta) +/** + * Allows providing a custom subclass of ASCollectionView to be managed by ASCollectionNode. + * + * @default [ASCollectionView class] is used whenever this property is unset or nil. + */ +@property (strong, nonatomic, nullable) Class collectionViewClass; + - (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout layoutFacilitator:(nullable id)layoutFacilitator; - (void)beginUpdates ASDISPLAYNODE_DEPRECATED_MSG("Use -performBatchUpdates:completion: instead."); diff --git a/Source/ASCollectionNode.mm b/Source/ASCollectionNode.mm index 4e5fc30d..172055ba 100644 --- a/Source/ASCollectionNode.mm +++ b/Source/ASCollectionNode.mm @@ -100,6 +100,7 @@ @interface ASCollectionNode () { ASDN::RecursiveMutex _environmentStateLock; + Class _collectionViewClass; } @property (nonatomic) _ASCollectionPendingState *pendingState; @end @@ -108,6 +109,20 @@ #pragma mark Lifecycle +- (Class)collectionViewClass +{ + return _collectionViewClass ? : [ASCollectionView class]; +} + +- (void)setCollectionViewClass:(Class)collectionViewClass +{ + if (_collectionViewClass != collectionViewClass) { + ASDisplayNodeAssert([collectionViewClass isSubclassOfClass:[ASCollectionView class]] || collectionViewClass == Nil, @"ASCollectionNode requires that .collectionViewClass is an ASCollectionView subclass"); + ASDisplayNodeAssert([self isNodeLoaded] == NO, @"ASCollectionNode's .collectionViewClass cannot be changed after the view is loaded"); + _collectionViewClass = collectionViewClass; + } +} + - (instancetype)init { ASDISPLAYNODE_NOT_DESIGNATED_INITIALIZER(); @@ -132,7 +147,7 @@ ASDisplayNodeViewBlock collectionViewBlock = ^UIView *{ // Variable will be unused if event logging is off. __unused __typeof__(self) strongSelf = weakSelf; - return [[ASCollectionView alloc] _initWithFrame:frame collectionViewLayout:layout layoutFacilitator:layoutFacilitator eventLog:ASDisplayNodeGetEventLog(strongSelf)]; + return [[[strongSelf collectionViewClass] alloc] _initWithFrame:frame collectionViewLayout:layout layoutFacilitator:layoutFacilitator eventLog:ASDisplayNodeGetEventLog(strongSelf)]; }; if (self = [super initWithViewBlock:collectionViewBlock didLoadBlock:nil]) {