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

Commit c40c2d3

Browse files
committed
Merge pull request #1024 from facebook/RangeControllerBeta
[ASRangeController] Newly rewritten, functional-style range controller based on ASInterfaceState.
2 parents 8f914f8 + b273f35 commit c40c2d3

27 files changed

Lines changed: 594 additions & 169 deletions

AsyncDisplayKit.xcodeproj/project.pbxproj

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@
459459
D785F6631A74327E00291744 /* ASScrollNode.m in Sources */ = {isa = PBXBuildFile; fileRef = D785F6611A74327E00291744 /* ASScrollNode.m */; };
460460
DB7121BCD50849C498C886FB /* libPods-AsyncDisplayKitTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EFA731F0396842FF8AB635EE /* libPods-AsyncDisplayKitTests.a */; };
461461
DE040EF91C2B40AC004692FF /* ASCollectionViewFlowLayoutInspector.h in Headers */ = {isa = PBXBuildFile; fileRef = 251B8EF41BBB3D690087C538 /* ASCollectionViewFlowLayoutInspector.h */; settings = {ATTRIBUTES = (Public, ); }; };
462+
DE0702FC1C3671E900D7DE62 /* libAsyncDisplayKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 058D09AC195D04C000B7D73C /* libAsyncDisplayKit.a */; };
462463
DE6EA3221C14000600183B10 /* ASDisplayNode+FrameworkPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = DE6EA3211C14000600183B10 /* ASDisplayNode+FrameworkPrivate.h */; };
463464
DE6EA3231C14000600183B10 /* ASDisplayNode+FrameworkPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = DE6EA3211C14000600183B10 /* ASDisplayNode+FrameworkPrivate.h */; };
464465
DE8BEAC11C2DF3FC00D57C12 /* ASDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = DE8BEABF1C2DF3FC00D57C12 /* ASDelegateProxy.h */; };
@@ -469,6 +470,10 @@
469470
DECBD6E81BE56E1900CF4905 /* ASButtonNode.h in Headers */ = {isa = PBXBuildFile; fileRef = DECBD6E51BE56E1900CF4905 /* ASButtonNode.h */; settings = {ATTRIBUTES = (Public, ); }; };
470471
DECBD6E91BE56E1900CF4905 /* ASButtonNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = DECBD6E61BE56E1900CF4905 /* ASButtonNode.mm */; };
471472
DECBD6EA1BE56E1900CF4905 /* ASButtonNode.mm in Sources */ = {isa = PBXBuildFile; fileRef = DECBD6E61BE56E1900CF4905 /* ASButtonNode.mm */; };
473+
DECC2ECD1C35C1C600388446 /* ASRangeControllerBeta.h in Headers */ = {isa = PBXBuildFile; fileRef = DECC2ECB1C35C1C600388446 /* ASRangeControllerBeta.h */; };
474+
DECC2ECE1C35C1C600388446 /* ASRangeControllerBeta.h in Headers */ = {isa = PBXBuildFile; fileRef = DECC2ECB1C35C1C600388446 /* ASRangeControllerBeta.h */; };
475+
DECC2ECF1C35C1C600388446 /* ASRangeControllerBeta.mm in Sources */ = {isa = PBXBuildFile; fileRef = DECC2ECC1C35C1C600388446 /* ASRangeControllerBeta.mm */; };
476+
DECC2ED01C35C1C600388446 /* ASRangeControllerBeta.mm in Sources */ = {isa = PBXBuildFile; fileRef = DECC2ECC1C35C1C600388446 /* ASRangeControllerBeta.mm */; };
472477
/* End PBXBuildFile section */
473478

474479
/* Begin PBXContainerItemProxy section */
@@ -762,6 +767,8 @@
762767
DE8BEAC01C2DF3FC00D57C12 /* ASDelegateProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASDelegateProxy.m; sourceTree = "<group>"; };
763768
DECBD6E51BE56E1900CF4905 /* ASButtonNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASButtonNode.h; sourceTree = "<group>"; };
764769
DECBD6E61BE56E1900CF4905 /* ASButtonNode.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASButtonNode.mm; sourceTree = "<group>"; };
770+
DECC2ECB1C35C1C600388446 /* ASRangeControllerBeta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASRangeControllerBeta.h; sourceTree = "<group>"; };
771+
DECC2ECC1C35C1C600388446 /* ASRangeControllerBeta.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASRangeControllerBeta.mm; sourceTree = "<group>"; };
765772
EFA731F0396842FF8AB635EE /* libPods-AsyncDisplayKitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AsyncDisplayKitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
766773
FB07EABBCF28656C6297BC2D /* Pods-AsyncDisplayKitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AsyncDisplayKitTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AsyncDisplayKitTests/Pods-AsyncDisplayKitTests.debug.xcconfig"; sourceTree = "<group>"; };
767774
/* End PBXFileReference section */
@@ -771,6 +778,7 @@
771778
isa = PBXFrameworksBuildPhase;
772779
buildActionMask = 2147483647;
773780
files = (
781+
DE0702FC1C3671E900D7DE62 /* libAsyncDisplayKit.a in Frameworks */,
774782
);
775783
runOnlyForDeploymentPostprocessing = 0;
776784
};
@@ -1029,6 +1037,8 @@
10291037
058D09E9195D050800B7D73C /* ASMutableAttributedStringBuilder.m */,
10301038
055F1A3619ABD413004DAFF1 /* ASRangeController.h */,
10311039
055F1A3719ABD413004DAFF1 /* ASRangeController.mm */,
1040+
DECC2ECB1C35C1C600388446 /* ASRangeControllerBeta.h */,
1041+
DECC2ECC1C35C1C600388446 /* ASRangeControllerBeta.mm */,
10321042
292C599C1A956527007E5DD6 /* ASRangeHandler.h */,
10331043
258FF4251C0D152600A83844 /* ASRangeHandlerVisible.h */,
10341044
258FF4261C0D152600A83844 /* ASRangeHandlerVisible.mm */,
@@ -1315,6 +1325,7 @@
13151325
9C65A72A1BA8EA4D0084DA91 /* ASLayoutOptionsPrivate.h in Headers */,
13161326
292C599F1A956527007E5DD6 /* ASLayoutRangeType.h in Headers */,
13171327
257754B61BEE44CD00737CA5 /* ASEqualityHashHelpers.h in Headers */,
1328+
DECC2ECD1C35C1C600388446 /* ASRangeControllerBeta.h in Headers */,
13181329
ACF6ED261B17843500DA7C62 /* ASLayoutSpec.h in Headers */,
13191330
ACF6ED4D1B17847A00DA7C62 /* ASLayoutSpecUtilities.h in Headers */,
13201331
AC026B6F1BD57DBF00BBC17E /* _ASHierarchyChangeSet.h in Headers */,
@@ -1373,6 +1384,7 @@
13731384
B350623C1B010EFD0018CF92 /* _ASAsyncTransaction.h in Headers */,
13741385
B350623E1B010EFD0018CF92 /* _ASAsyncTransactionContainer+Private.h in Headers */,
13751386
B350623F1B010EFD0018CF92 /* _ASAsyncTransactionContainer.h in Headers */,
1387+
DECC2ECE1C35C1C600388446 /* ASRangeControllerBeta.h in Headers */,
13761388
254C6B7E1BF94DF4003EC431 /* ASTextKitTailTruncater.h in Headers */,
13771389
B35062411B010EFD0018CF92 /* _ASAsyncTransactionGroup.h in Headers */,
13781390
B35062491B010EFD0018CF92 /* _ASCoreAnimationExtras.h in Headers */,
@@ -1753,6 +1765,7 @@
17531765
257754BE1BEE458E00737CA5 /* ASTextKitHelpers.mm in Sources */,
17541766
257754A91BEE44CD00737CA5 /* ASTextKitContext.mm in Sources */,
17551767
ACF6ED501B17847A00DA7C62 /* ASStackPositionedLayout.mm in Sources */,
1768+
DECC2ECF1C35C1C600388446 /* ASRangeControllerBeta.mm in Sources */,
17561769
ACF6ED521B17847A00DA7C62 /* ASStackUnpositionedLayout.mm in Sources */,
17571770
257754A61BEE44CD00737CA5 /* ASTextKitAttributes.mm in Sources */,
17581771
ACF6ED321B17843500DA7C62 /* ASStaticLayoutSpec.mm in Sources */,
@@ -1883,6 +1896,7 @@
18831896
9C8221981BA237B80037F19A /* ASStackBaselinePositionedLayout.mm in Sources */,
18841897
34EFC7721B701D0300AD841F /* ASStackLayoutSpec.mm in Sources */,
18851898
34EFC7761B701D2A00AD841F /* ASStackPositionedLayout.mm in Sources */,
1899+
DECC2ED01C35C1C600388446 /* ASRangeControllerBeta.mm in Sources */,
18861900
34EFC7781B701D3100AD841F /* ASStackUnpositionedLayout.mm in Sources */,
18871901
AC026B6C1BD57D6F00BBC17E /* ASChangeSetDataController.m in Sources */,
18881902
34EFC7741B701D0A00AD841F /* ASStaticLayoutSpec.mm in Sources */,

AsyncDisplayKit/ASCollectionView.mm

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#import "ASCollectionViewLayoutController.h"
1515
#import "ASCollectionViewFlowLayoutInspector.h"
1616
#import "ASDisplayNode+FrameworkPrivate.h"
17+
#import "ASDisplayNode+Beta.h"
1718
#import "ASInternalHelpers.h"
1819
#import "ASRangeController.h"
1920
#import "UICollectionViewLayout+ASConvenience.h"
@@ -150,9 +151,12 @@ - (instancetype)_initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionV
150151
self.strongCollectionNode = collectionNode;
151152
}
152153

153-
_layoutController = [[ASCollectionViewLayoutController alloc] initWithCollectionView:self];
154+
_layoutController = [ASDisplayNode shouldUseNewRenderingRange] ?
155+
[[ASCollectionViewLayoutControllerBeta alloc] initWithCollectionView:self] :
156+
[[ASCollectionViewLayoutControllerStable alloc] initWithCollectionView:self];
154157

155-
_rangeController = [[ASRangeController alloc] init];
158+
_rangeController = [ASDisplayNode shouldUseNewRenderingRange] ? [[ASRangeControllerBeta alloc] init]
159+
: [[ASRangeControllerStable alloc] init];
156160
_rangeController.dataSource = self;
157161
_rangeController.delegate = self;
158162
_rangeController.layoutController = _layoutController;
@@ -319,22 +323,22 @@ - (void)setAsyncDelegate:(id<ASCollectionViewDelegate>)asyncDelegate
319323

320324
- (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeType:(ASLayoutRangeType)rangeType
321325
{
322-
[_layoutController setTuningParameters:tuningParameters forRangeType:rangeType];
326+
[_rangeController setTuningParameters:tuningParameters forRangeType:rangeType];
323327
}
324328

325329
- (ASRangeTuningParameters)tuningParametersForRangeType:(ASLayoutRangeType)rangeType
326330
{
327-
return [_layoutController tuningParametersForRangeType:rangeType];
331+
return [_rangeController tuningParametersForRangeType:rangeType];
328332
}
329333

330334
- (ASRangeTuningParameters)rangeTuningParameters
331335
{
332-
return [self tuningParametersForRangeType:ASLayoutRangeTypeRender];
336+
return [self tuningParametersForRangeType:ASLayoutRangeTypeDisplay];
333337
}
334338

335339
- (void)setRangeTuningParameters:(ASRangeTuningParameters)tuningParameters
336340
{
337-
[self setTuningParameters:tuningParameters forRangeType:ASLayoutRangeTypeRender];
341+
[self setTuningParameters:tuningParameters forRangeType:ASLayoutRangeTypeDisplay];
338342
}
339343

340344
- (CGSize)calculatedSizeForNodeAtIndexPath:(NSIndexPath *)indexPath
@@ -775,6 +779,11 @@ - (NSArray *)rangeController:(ASRangeController *)rangeController nodesAtIndexPa
775779
return [_dataController nodesAtIndexPaths:indexPaths];
776780
}
777781

782+
- (ASDisplayNode *)rangeController:(ASRangeController *)rangeController nodeAtIndexPath:(NSIndexPath *)indexPath
783+
{
784+
return [_dataController nodeAtIndexPath:indexPath];
785+
}
786+
778787
#pragma mark - ASRangeControllerDelegate
779788

780789
- (void)didBeginUpdatesInRangeController:(ASRangeController *)rangeController

AsyncDisplayKit/ASDisplayNode.mm

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -203,20 +203,26 @@ + (void)scheduleNodeForDisplay:(ASDisplayNode *)node
203203
ASDisplayNodeAssertMainThread();
204204
static NSMutableSet *nodesToDisplay = nil;
205205
static BOOL displayScheduled = NO;
206-
if (!nodesToDisplay) {
207-
nodesToDisplay = [[NSMutableSet alloc] init];
206+
static ASDN::RecursiveMutex displaySchedulerLock;
207+
{
208+
ASDN::MutexLocker l(displaySchedulerLock);
209+
if (!nodesToDisplay) {
210+
nodesToDisplay = [[NSMutableSet alloc] init];
211+
}
212+
[nodesToDisplay addObject:node];
208213
}
209-
[nodesToDisplay addObject:node];
210214
if (!displayScheduled) {
211215
displayScheduled = YES;
212216
// It's essenital that any layout pass that is scheduled during the current
213217
// runloop has a chance to be applied / scheduled, so always perform this after the current runloop.
214218
dispatch_async(dispatch_get_main_queue(), ^{
219+
ASDN::MutexLocker l(displaySchedulerLock);
215220
displayScheduled = NO;
216-
for (ASDisplayNode *node in nodesToDisplay) {
221+
NSSet *displayingNodes = [nodesToDisplay copy];
222+
nodesToDisplay = nil;
223+
for (ASDisplayNode *node in displayingNodes) {
217224
[node __recursivelyTriggerDisplayAndBlock:NO];
218225
}
219-
nodesToDisplay = nil;
220226
});
221227
}
222228
}
@@ -1835,6 +1841,15 @@ - (void)exitInterfaceState:(ASInterfaceState)interfaceState
18351841
});
18361842
}
18371843

1844+
- (void)recursivelySetInterfaceState:(ASInterfaceState)interfaceState
1845+
{
1846+
ASDisplayNodePerformBlockOnEveryNode(nil, self, ^(ASDisplayNode *node) {
1847+
node.interfaceState = interfaceState;
1848+
});
1849+
// FIXME: This should also be called in setInterfaceState: if it isn't being applied recursively.
1850+
[ASDisplayNode scheduleNodeForDisplay:self];
1851+
}
1852+
18381853
- (ASHierarchyState)hierarchyState
18391854
{
18401855
ASDN::MutexLocker l(_propertyLock);

AsyncDisplayKit/ASPagerNode.m

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#import "ASPagerNode.h"
1010
#import "ASDelegateProxy.h"
1111
#import "ASDisplayNode+Subclasses.h"
12+
#import "UICollectionViewLayout+ASConvenience.h"
1213

1314
@interface ASPagerNode () <ASCollectionDataSource, ASCollectionViewDelegateFlowLayout, ASDelegateProxyInterceptor>
1415
{
@@ -34,7 +35,7 @@ - (instancetype)init
3435

3536
- (instancetype)initWithCollectionViewLayout:(UICollectionViewFlowLayout *)flowLayout;
3637
{
37-
ASDisplayNodeAssert([flowLayout isKindOfClass:[UICollectionViewFlowLayout class]], @"ASPagerNode requires a flow layout.");
38+
ASDisplayNodeAssert([flowLayout asdk_isFlowLayout], @"ASPagerNode requires a flow layout.");
3839
self = [super initWithCollectionViewLayout:flowLayout];
3940
if (self != nil) {
4041
_flowLayout = flowLayout;
@@ -61,8 +62,8 @@ - (void)didLoad
6162

6263
ASRangeTuningParameters preloadParams = { .leadingBufferScreenfuls = 2.0, .trailingBufferScreenfuls = 2.0 };
6364
ASRangeTuningParameters renderParams = { .leadingBufferScreenfuls = 1.0, .trailingBufferScreenfuls = 1.0 };
64-
[self setTuningParameters:preloadParams forRangeType:ASLayoutRangeTypePreload];
65-
[self setTuningParameters:renderParams forRangeType:ASLayoutRangeTypeRender];
65+
[self setTuningParameters:preloadParams forRangeType:ASLayoutRangeTypeFetchData];
66+
[self setTuningParameters:renderParams forRangeType:ASLayoutRangeTypeDisplay];
6667
}
6768

6869
#pragma mark - Helpers

AsyncDisplayKit/ASTableView.mm

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#import "ASChangeSetDataController.h"
1414
#import "ASCollectionViewLayoutController.h"
1515
#import "ASDelegateProxy.h"
16+
#import "ASDisplayNode+Beta.h"
1617
#import "ASDisplayNode+FrameworkPrivate.h"
1718
#import "ASInternalHelpers.h"
1819
#import "ASLayout.h"
@@ -85,7 +86,10 @@ @interface ASTableNode ()
8586
- (instancetype)_initWithTableView:(ASTableView *)tableView;
8687
@end
8788

88-
@interface ASTableView () <ASRangeControllerDataSource, ASRangeControllerDelegate, ASDataControllerSource, _ASTableViewCellDelegate, ASCellNodeLayoutDelegate, ASDelegateProxyInterceptor> {
89+
@interface ASTableView () <ASRangeControllerDataSource, ASRangeControllerDelegate,
90+
ASDataControllerSource, _ASTableViewCellDelegate,
91+
ASCellNodeLayoutDelegate, ASDelegateProxyInterceptor>
92+
{
8993
ASTableViewProxy *_proxyDataSource;
9094
ASTableViewProxy *_proxyDelegate;
9195

@@ -139,7 +143,8 @@ - (void)configureWithDataControllerClass:(Class)dataControllerClass
139143
{
140144
_layoutController = [[ASFlowLayoutController alloc] initWithScrollOption:ASFlowLayoutDirectionVertical];
141145

142-
_rangeController = [[ASRangeController alloc] init];
146+
_rangeController = [ASDisplayNode shouldUseNewRenderingRange] ? [[ASRangeControllerBeta alloc] init]
147+
: [[ASRangeControllerStable alloc] init];
143148
_rangeController.layoutController = _layoutController;
144149
_rangeController.dataSource = self;
145150
_rangeController.delegate = self;
@@ -317,12 +322,12 @@ - (ASRangeTuningParameters)tuningParametersForRangeType:(ASLayoutRangeType)range
317322

318323
- (ASRangeTuningParameters)rangeTuningParameters
319324
{
320-
return [self tuningParametersForRangeType:ASLayoutRangeTypeRender];
325+
return [self tuningParametersForRangeType:ASLayoutRangeTypeDisplay];
321326
}
322327

323328
- (void)setRangeTuningParameters:(ASRangeTuningParameters)tuningParameters
324329
{
325-
[self setTuningParameters:tuningParameters forRangeType:ASLayoutRangeTypeRender];
330+
[self setTuningParameters:tuningParameters forRangeType:ASLayoutRangeTypeDisplay];
326331
}
327332

328333
- (ASCellNode *)nodeForRowAtIndexPath:(NSIndexPath *)indexPath
@@ -684,6 +689,11 @@ - (NSArray *)rangeController:(ASRangeController *)rangeController nodesAtIndexPa
684689
return [_dataController nodesAtIndexPaths:indexPaths];
685690
}
686691

692+
- (ASDisplayNode *)rangeController:(ASRangeController *)rangeController nodeAtIndexPath:(NSIndexPath *)indexPath
693+
{
694+
return [_dataController nodeAtIndexPath:indexPath];
695+
}
696+
687697
- (CGSize)viewportSizeForRangeController:(ASRangeController *)rangeController
688698
{
689699
ASDisplayNodeAssertMainThread();

AsyncDisplayKit/Details/ASAbstractLayoutController.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@ NS_ASSUME_NONNULL_BEGIN
1313

1414
@interface ASAbstractLayoutController : NSObject <ASLayoutController>
1515

16-
- (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeType:(ASLayoutRangeType)rangeType;
17-
18-
- (ASRangeTuningParameters)tuningParametersForRangeType:(ASLayoutRangeType)rangeType;
19-
2016
@end
2117

2218
NS_ASSUME_NONNULL_END

AsyncDisplayKit/Details/ASAbstractLayoutController.mm

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
@interface ASAbstractLayoutController () {
1616
std::vector<ASRangeTuningParameters> _tuningParameters;
17+
CGSize _viewportSize;
1718
}
1819
@end
1920

@@ -30,11 +31,11 @@ - (instancetype)init
3031
.leadingBufferScreenfuls = 0,
3132
.trailingBufferScreenfuls = 0
3233
};
33-
_tuningParameters[ASLayoutRangeTypeRender] = {
34+
_tuningParameters[ASLayoutRangeTypeDisplay] = {
3435
.leadingBufferScreenfuls = 1.5,
3536
.trailingBufferScreenfuls = 0.75
3637
};
37-
_tuningParameters[ASLayoutRangeTypePreload] = {
38+
_tuningParameters[ASLayoutRangeTypeFetchData] = {
3839
.leadingBufferScreenfuls = 3,
3940
.trailingBufferScreenfuls = 2
4041
};
@@ -60,16 +61,27 @@ - (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeTy
6061

6162
#pragma mark - Abstract Index Path Range Support
6263

63-
- (BOOL)shouldUpdateForVisibleIndexPaths:(NSArray *)indexPaths viewportSize:(CGSize)viewportSize rangeType:(ASLayoutRangeType)rangeType
64+
// FIXME: This method can be removed once ASRangeControllerBeta becomes the main version.
65+
- (BOOL)shouldUpdateForVisibleIndexPaths:(NSArray *)indexPaths rangeType:(ASLayoutRangeType)rangeType
6466
{
6567
ASDisplayNodeAssertNotSupported();
6668
return NO;
6769
}
6870

69-
- (NSSet *)indexPathsForScrolling:(ASScrollDirection)scrollDirection viewportSize:(CGSize)viewportSize rangeType:(ASLayoutRangeType)rangeType
71+
- (NSSet *)indexPathsForScrolling:(ASScrollDirection)scrollDirection rangeType:(ASLayoutRangeType)rangeType
7072
{
7173
ASDisplayNodeAssertNotSupported();
7274
return nil;
7375
}
7476

77+
- (void)setViewportSize:(CGSize)viewportSize
78+
{
79+
_viewportSize = viewportSize;
80+
}
81+
82+
- (CGSize)viewportSize
83+
{
84+
return _viewportSize;
85+
}
86+
7587
@end

AsyncDisplayKit/Details/ASCollectionViewLayoutController.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,10 @@ NS_ASSUME_NONNULL_BEGIN
1919

2020
@end
2121

22+
@interface ASCollectionViewLayoutControllerStable : ASCollectionViewLayoutController
23+
@end
24+
25+
@interface ASCollectionViewLayoutControllerBeta : ASCollectionViewLayoutController
26+
@end
27+
2228
NS_ASSUME_NONNULL_END

0 commit comments

Comments
 (0)