diff --git a/AsyncDisplayKit/ASCollectionView.mm b/AsyncDisplayKit/ASCollectionView.mm index c59a492ad5..9196567863 100644 --- a/AsyncDisplayKit/ASCollectionView.mm +++ b/AsyncDisplayKit/ASCollectionView.mm @@ -212,7 +212,6 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; struct { unsigned int didChangeCollectionViewDataSource:1; unsigned int didChangeCollectionViewDelegate:1; - unsigned int scrollableDirections:1; } _layoutInspectorFlags; } @@ -515,7 +514,6 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; _layoutInspectorFlags.didChangeCollectionViewDataSource = [_layoutInspector respondsToSelector:@selector(didChangeCollectionViewDataSource:)]; _layoutInspectorFlags.didChangeCollectionViewDelegate = [_layoutInspector respondsToSelector:@selector(didChangeCollectionViewDelegate:)]; - _layoutInspectorFlags.scrollableDirections = [_layoutInspector respondsToSelector:@selector(scrollableDirections)]; } - (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeType:(ASLayoutRangeType)rangeType @@ -1117,23 +1115,8 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; - (ASScrollDirection)scrollableDirections { - //Cache results of layoutInspector to ensure flags are up to date if getter lazily loads a new one. - id layoutInspector = self.layoutInspector; - if (_layoutInspectorFlags.scrollableDirections) { - return [layoutInspector scrollableDirections]; - } else { - ASScrollDirection scrollableDirection = ASScrollDirectionNone; - CGFloat totalContentWidth = self.contentSize.width + self.contentInset.left + self.contentInset.right; - CGFloat totalContentHeight = self.contentSize.height + self.contentInset.top + self.contentInset.bottom; - - if (self.alwaysBounceHorizontal || totalContentWidth > self.bounds.size.width) { // Can scroll horizontally. - scrollableDirection |= ASScrollDirectionHorizontalDirections; - } - if (self.alwaysBounceVertical || totalContentHeight > self.bounds.size.height) { // Can scroll vertically. - scrollableDirection |= ASScrollDirectionVerticalDirections; - } - return scrollableDirection; - } + ASDisplayNodeAssertNotNil(self.layoutInspector, @"Layout inspector should be assigned."); + return [self.layoutInspector scrollableDirections]; } - (ASScrollDirection)flowLayoutScrollableDirections:(UICollectionViewFlowLayout *)flowLayout { @@ -1672,6 +1655,9 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; */ - (void)layer:(CALayer *)layer didChangeBoundsWithOldValue:(CGRect)oldBounds newValue:(CGRect)newBounds { + if (self.collectionViewLayout == nil) { + return; + } CGSize lastUsedSize = _lastBoundsSizeUsedForMeasuringNodes; if (CGSizeEqualToSize(lastUsedSize, newBounds.size)) { return; diff --git a/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.h b/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.h index 3c34bfc909..7453acb4b7 100644 --- a/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.h +++ b/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.h @@ -27,6 +27,11 @@ NS_ASSUME_NONNULL_BEGIN */ - (ASSizeRange)collectionView:(ASCollectionView *)collectionView constrainedSizeForNodeAtIndexPath:(NSIndexPath *)indexPath; +/** + * Return the directions in which your collection view can scroll + */ +- (ASScrollDirection)scrollableDirections; + @optional /** @@ -53,11 +58,6 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)didChangeCollectionViewDataSource:(nullable id)dataSource; -/** - * Return the directions in which your collection view can scroll - */ -- (ASScrollDirection)scrollableDirections; - #pragma mark Deprecated Methods /** diff --git a/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.m b/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.m index 504d0d5f2b..7f0e1911c7 100644 --- a/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.m +++ b/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.m @@ -79,6 +79,12 @@ static inline ASSizeRange NodeConstrainedSizeForScrollDirection(ASCollectionView return NodeConstrainedSizeForScrollDirection(collectionView); } +- (ASScrollDirection)scrollableDirections +{ + ASDisplayNodeAssert(NO, @"layoutInspector object must implement -scrollableDirections %@", self); + return ASScrollDirectionNone; +} + - (ASSizeRange)collectionView:(ASCollectionView *)collectionView constrainedSizeForSupplementaryNodeOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { ASDisplayNodeAssert(NO, @"To support supplementary nodes in ASCollectionView, it must have a layoutInspector for layout inspection. (See ASCollectionViewFlowLayoutInspector for an example.)"); diff --git a/examples/CustomCollectionView/Sample/MosaicCollectionViewLayout.m b/examples/CustomCollectionView/Sample/MosaicCollectionViewLayout.m index bff0657e60..7396de226d 100644 --- a/examples/CustomCollectionView/Sample/MosaicCollectionViewLayout.m +++ b/examples/CustomCollectionView/Sample/MosaicCollectionViewLayout.m @@ -214,6 +214,11 @@ return ASSizeRangeMake(CGSizeZero, [layout _headerSizeForSection:indexPath.section]); } +- (ASScrollDirection)scrollableDirections +{ + return ASScrollDirectionVerticalDirections; +} + /** * Asks the inspector for the number of supplementary views for the given kind in the specified section. */