Skip to content
This repository was archived by the owner on Feb 2, 2023. It is now read-only.

Commit aa0c64e

Browse files
committed
Merge pull request #1064 from binl/bl_layout_facilitator_change
Initial implementation of ASCollectionNode's LayoutFacilitator to help apps optimize custom layouts.
2 parents 3aceabb + 1965018 commit aa0c64e

7 files changed

Lines changed: 70 additions & 7 deletions

File tree

AsyncDisplayKit.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,8 @@
357357
ACF6ED631B178DC700DA7C62 /* ASStackLayoutSpecSnapshotTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = ACF6ED5B1B178DC700DA7C62 /* ASStackLayoutSpecSnapshotTests.mm */; };
358358
B0F8805A1BEAEC7500D17647 /* ASTableNode.h in Headers */ = {isa = PBXBuildFile; fileRef = B0F880581BEAEC7500D17647 /* ASTableNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
359359
B0F8805B1BEAEC7500D17647 /* ASTableNode.m in Sources */ = {isa = PBXBuildFile; fileRef = B0F880591BEAEC7500D17647 /* ASTableNode.m */; };
360+
B13CA0F71C519E9400E031AB /* ASCollectionViewLayoutFacilitatorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = B13CA0F61C519E9400E031AB /* ASCollectionViewLayoutFacilitatorProtocol.h */; };
361+
B13CA0F81C519EBA00E031AB /* ASCollectionViewLayoutFacilitatorProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = B13CA0F61C519E9400E031AB /* ASCollectionViewLayoutFacilitatorProtocol.h */; };
360362
B35061F31B010EFD0018CF92 /* ASCellNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 055F1A3A19ABD43F004DAFF1 /* ASCellNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
361363
B35061F51B010EFD0018CF92 /* ASCollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = AC3C4A4F1A1139C100143C57 /* ASCollectionView.h */; settings = {ATTRIBUTES = (Public, ); }; };
362364
B35061F61B010EFD0018CF92 /* ASCollectionView.mm in Sources */ = {isa = PBXBuildFile; fileRef = AC3C4A501A1139C100143C57 /* ASCollectionView.mm */; };
@@ -765,6 +767,7 @@
765767
ACF6ED5B1B178DC700DA7C62 /* ASStackLayoutSpecSnapshotTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASStackLayoutSpecSnapshotTests.mm; sourceTree = "<group>"; };
766768
B0F880581BEAEC7500D17647 /* ASTableNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASTableNode.h; sourceTree = "<group>"; };
767769
B0F880591BEAEC7500D17647 /* ASTableNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASTableNode.m; sourceTree = "<group>"; };
770+
B13CA0F61C519E9400E031AB /* ASCollectionViewLayoutFacilitatorProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASCollectionViewLayoutFacilitatorProtocol.h; sourceTree = "<group>"; };
768771
B35061DA1B010EDF0018CF92 /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
769772
B35061DD1B010EDF0018CF92 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = "../AsyncDisplayKit-iOS/Info.plist"; sourceTree = "<group>"; };
770773
CC7FD9DC1BB5E962005CCB2B /* ASPhotosFrameworkImageRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASPhotosFrameworkImageRequest.h; sourceTree = "<group>"; };
@@ -908,6 +911,7 @@
908911
AC3C4A4F1A1139C100143C57 /* ASCollectionView.h */,
909912
AC3C4A501A1139C100143C57 /* ASCollectionView.mm */,
910913
AC3C4A531A113EEC00143C57 /* ASCollectionViewProtocols.h */,
914+
B13CA0F61C519E9400E031AB /* ASCollectionViewLayoutFacilitatorProtocol.h */,
911915
DEC146B41C37A16A004A0EE7 /* ASCollectionInternal.h */,
912916
DEC146B51C37A16A004A0EE7 /* ASCollectionInternal.m */,
913917
058D09D5195D050800B7D73C /* ASControlNode.h */,
@@ -1276,6 +1280,7 @@
12761280
058D0A72195D05F800B7D73C /* _ASCoreAnimationExtras.h in Headers */,
12771281
058D0A53195D05DC00B7D73C /* _ASDisplayLayer.h in Headers */,
12781282
058D0A55195D05DC00B7D73C /* _ASDisplayView.h in Headers */,
1283+
B13CA0F71C519E9400E031AB /* ASCollectionViewLayoutFacilitatorProtocol.h in Headers */,
12791284
058D0A74195D05F800B7D73C /* _ASPendingState.h in Headers */,
12801285
9C5586691BD549CB00B50E3A /* ASAsciiArtBoxCreator.h in Headers */,
12811286
058D0A76195D05F900B7D73C /* _ASScopeTimer.h in Headers */,
@@ -1474,6 +1479,7 @@
14741479
B35062041B010EFD0018CF92 /* ASMultiplexImageNode.h in Headers */,
14751480
DECBD6E81BE56E1900CF4905 /* ASButtonNode.h in Headers */,
14761481
B35062241B010EFD0018CF92 /* ASMutableAttributedStringBuilder.h in Headers */,
1482+
B13CA0F81C519EBA00E031AB /* ASCollectionViewLayoutFacilitatorProtocol.h in Headers */,
14771483
B35062061B010EFD0018CF92 /* ASNetworkImageNode.h in Headers */,
14781484
34EFC76C1B701CED00AD841F /* ASOverlayLayoutSpec.h in Headers */,
14791485
B35062261B010EFD0018CF92 /* ASRangeController.h in Headers */,

AsyncDisplayKit/ASCollectionNode.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
#import <AsyncDisplayKit/ASCollectionView.h>
1010

11+
@protocol ASCollectionViewLayoutFacilitatorProtocol;
12+
1113
NS_ASSUME_NONNULL_BEGIN
1214

1315
/**
@@ -18,6 +20,7 @@ NS_ASSUME_NONNULL_BEGIN
1820

1921
- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout;
2022
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout;
23+
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout layoutFacilitator:(nullable id<ASCollectionViewLayoutFacilitatorProtocol>)layoutFacilitator;
2124

2225
@property (weak, nonatomic) id <ASCollectionDelegate> delegate;
2326
@property (weak, nonatomic) id <ASCollectionDataSource> dataSource;

AsyncDisplayKit/ASCollectionNode.mm

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#import "ASCollectionNode.h"
1010
#import "ASCollectionInternal.h"
11+
#import "ASCollectionViewLayoutFacilitatorProtocol.h"
1112
#import "ASDisplayNode+Subclasses.h"
1213
#import "ASRangeController.h"
1314
#include <vector>
@@ -83,9 +84,14 @@ - (instancetype)_initWithCollectionView:(ASCollectionView *)collectionView
8384
}
8485

8586
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout
87+
{
88+
return [self initWithFrame:frame collectionViewLayout:layout layoutFacilitator:nil];
89+
}
90+
91+
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout layoutFacilitator:(id<ASCollectionViewLayoutFacilitatorProtocol>)layoutFacilitator
8692
{
8793
ASDisplayNodeViewBlock collectionViewBlock = ^UIView *{
88-
return [[ASCollectionView alloc] _initWithFrame:frame collectionViewLayout:layout ownedByNode:YES];
94+
return [[ASCollectionView alloc] _initWithFrame:CGRectZero collectionViewLayout:layout layoutFacilitator:layoutFacilitator ownedByNode:YES];
8995
};
9096

9197
if (self = [super initWithViewBlock:collectionViewBlock]) {

AsyncDisplayKit/ASCollectionView.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
@protocol ASCollectionDataSource;
2020
@protocol ASCollectionDelegate;
2121
@protocol ASCollectionViewLayoutInspecting;
22+
@protocol ASCollectionViewLayoutFacilitatorProtocol;
2223

2324
NS_ASSUME_NONNULL_BEGIN
2425

@@ -43,6 +44,7 @@ NS_ASSUME_NONNULL_BEGIN
4344
*/
4445
- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout;
4546
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout;
47+
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout layoutFacilitator:(id<ASCollectionViewLayoutFacilitatorProtocol>)layoutFacilitator;
4648

4749
// The corresponding ASCollectionNode, which exists even if directly allocating & handling the view class.
4850
@property (nonatomic, weak, readonly) ASCollectionNode *collectionNode;

AsyncDisplayKit/ASCollectionView.mm

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#import "ASCollectionDataController.h"
1414
#import "ASCollectionViewLayoutController.h"
1515
#import "ASCollectionViewFlowLayoutInspector.h"
16+
#import "ASCollectionViewLayoutFacilitatorProtocol.h"
1617
#import "ASDisplayNode+FrameworkPrivate.h"
1718
#import "ASDisplayNode+Beta.h"
1819
#import "ASInternalHelpers.h"
@@ -67,6 +68,8 @@ @interface ASCollectionView () <ASRangeControllerDataSource, ASRangeControllerDe
6768
ASRangeController *_rangeController;
6869
ASCollectionViewLayoutController *_layoutController;
6970
ASCollectionViewFlowLayoutInspector *_flowLayoutInspector;
71+
72+
id<ASCollectionViewLayoutFacilitatorProtocol> _layoutFacilitator;
7073

7174
BOOL _performingBatchUpdates;
7275
NSMutableArray *_batchUpdateBlocks;
@@ -137,13 +140,25 @@ - (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionVi
137140
return [self _initWithFrame:frame collectionViewLayout:layout ownedByNode:NO];
138141
}
139142

143+
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout layoutFacilitator:(id<ASCollectionViewLayoutFacilitatorProtocol>)layoutFacilitator
144+
{
145+
self = [self _initWithFrame:frame collectionViewLayout:layout ownedByNode:NO];
146+
_layoutFacilitator = layoutFacilitator;
147+
return self;
148+
}
149+
140150
// FIXME: This method is deprecated and will probably be removed in or shortly after 2.0.
141151
- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout asyncDataFetching:(BOOL)asyncDataFetchingEnabled
142152
{
143153
return [self _initWithFrame:frame collectionViewLayout:layout ownedByNode:NO];
144154
}
145155

146156
- (instancetype)_initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout ownedByNode:(BOOL)ownedByNode
157+
{
158+
return [self _initWithFrame:frame collectionViewLayout:layout layoutFacilitator:nil ownedByNode:ownedByNode];
159+
}
160+
161+
- (instancetype)_initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout layoutFacilitator:(id<ASCollectionViewLayoutFacilitatorProtocol>)layoutFacilitator ownedByNode:(BOOL)ownedByNode
147162
{
148163
if (!(self = [super initWithFrame:frame collectionViewLayout:layout]))
149164
return nil;
@@ -195,6 +210,7 @@ - (instancetype)_initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionV
195210
if ([layout asdk_isFlowLayout]) {
196211
_layoutInspector = [self flowLayoutInspector];
197212
}
213+
_layoutFacilitator = layoutFacilitator;
198214

199215
_proxyDelegate = [[ASCollectionViewProxy alloc] initWithTarget:nil interceptor:self];
200216
super.delegate = (id<UICollectionViewDelegate>)_proxyDelegate;
@@ -833,7 +849,7 @@ - (void)didBeginUpdatesInRangeController:(ASRangeController *)rangeController
833849
- (void)rangeController:(ASRangeController *)rangeController didEndUpdatesAnimated:(BOOL)animated completion:(void (^)(BOOL))completion
834850
{
835851
ASDisplayNodeAssertMainThread();
836-
852+
837853
if (!self.asyncDataSource || _superIsPendingDataLoad) {
838854
if (completion) {
839855
completion(NO);
@@ -856,7 +872,7 @@ - (void)rangeController:(ASRangeController *)rangeController didEndUpdatesAnimat
856872
- (void)rangeController:(ASRangeController *)rangeController didInsertNodes:(NSArray *)nodes atIndexPaths:(NSArray *)indexPaths withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions
857873
{
858874
ASDisplayNodeAssertMainThread();
859-
875+
[_layoutFacilitator collectionViewEditingCellsAtIndexPaths:indexPaths];
860876
if (!self.asyncDataSource || _superIsPendingDataLoad) {
861877
return; // if the asyncDataSource has become invalid while we are processing, ignore this request to avoid crashes
862878
}
@@ -875,7 +891,7 @@ - (void)rangeController:(ASRangeController *)rangeController didInsertNodes:(NSA
875891
- (void)rangeController:(ASRangeController *)rangeController didDeleteNodes:(NSArray *)nodes atIndexPaths:(NSArray *)indexPaths withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions
876892
{
877893
ASDisplayNodeAssertMainThread();
878-
894+
[_layoutFacilitator collectionViewEditingCellsAtIndexPaths:indexPaths];
879895
if (!self.asyncDataSource || _superIsPendingDataLoad) {
880896
return; // if the asyncDataSource has become invalid while we are processing, ignore this request to avoid crashes
881897
}
@@ -894,7 +910,7 @@ - (void)rangeController:(ASRangeController *)rangeController didDeleteNodes:(NSA
894910
- (void)rangeController:(ASRangeController *)rangeController didInsertSectionsAtIndexSet:(NSIndexSet *)indexSet withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions
895911
{
896912
ASDisplayNodeAssertMainThread();
897-
913+
[_layoutFacilitator collectionViewEditingSectionsAtIndexSet:indexSet];
898914
if (!self.asyncDataSource || _superIsPendingDataLoad) {
899915
return; // if the asyncDataSource has become invalid while we are processing, ignore this request to avoid crashes
900916
}
@@ -913,7 +929,7 @@ - (void)rangeController:(ASRangeController *)rangeController didInsertSectionsAt
913929
- (void)rangeController:(ASRangeController *)rangeController didDeleteSectionsAtIndexSet:(NSIndexSet *)indexSet withAnimationOptions:(ASDataControllerAnimationOptions)animationOptions
914930
{
915931
ASDisplayNodeAssertMainThread();
916-
932+
[_layoutFacilitator collectionViewEditingSectionsAtIndexSet:indexSet];
917933
if (!self.asyncDataSource || _superIsPendingDataLoad) {
918934
return; // if the asyncDataSource has become invalid while we are processing, ignore this request to avoid crashes
919935
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/* Copyright (c) 2014-present, Facebook, Inc.
2+
* All rights reserved.
3+
*
4+
* This source code is licensed under the BSD-style license found in the
5+
* LICENSE file in the root directory of this source tree. An additional grant
6+
* of patent rights can be found in the PATENTS file in the same directory.
7+
*/
8+
9+
#ifndef ASCollectionViewLayoutFacilitatorProtocol_h
10+
#define ASCollectionViewLayoutFacilitatorProtocol_h
11+
12+
/**
13+
* This facilitator protocol is intended to help Layout to better
14+
* gel with the CollectionView
15+
*/
16+
@protocol ASCollectionViewLayoutFacilitatorProtocol <NSObject>
17+
18+
/**
19+
* Inform that the collectionView is editing the cells at a list of indexPaths
20+
*/
21+
- (void)collectionViewEditingCellsAtIndexPaths:(NSArray *)indexPaths;
22+
23+
/**
24+
* Inform that the collectionView is editing the sections at a set of indexes
25+
*/
26+
- (void)collectionViewEditingSectionsAtIndexSet:(NSIndexSet *)indexes;
27+
28+
@end
29+
30+
#endif /* ASCollectionViewLayoutFacilitatorProtocol_h */

AsyncDisplayKit/Details/ASCollectionInternal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#import "ASRangeController.h"
1212

1313
@interface ASCollectionView ()
14-
- (instancetype)_initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout ownedByNode:(BOOL)ownedByNode;
14+
- (instancetype)_initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout layoutFacilitator:(id<ASCollectionViewLayoutFacilitatorProtocol>)layoutFacilitator ownedByNode:(BOOL)ownedByNode;
1515

1616
@property (nonatomic, weak, readwrite) ASCollectionNode *collectionNode;
1717
@property (nonatomic, strong, readonly) ASRangeController *rangeController;

0 commit comments

Comments
 (0)