From 1d28639301ff48d7d95d4a1cf01d1ccd392f8c78 Mon Sep 17 00:00:00 2001 From: Garrett Moon Date: Fri, 14 Oct 2016 09:39:28 -0700 Subject: [PATCH] =?UTF-8?q?[ASCollectionNode]=20Add=20scrollableDirections?= =?UTF-8?q?=20method=20to=20ASCollectionViewLayoutInspecting=20p=E2=80=A6?= =?UTF-8?q?=20(#2381)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add scrollableDirections method to ASCollectionViewLayoutInspecting protocol ASViewController's default method will not always return the correct scrollable directions in cases where size changes may not have been applied. This allows us to ignore this issue for a little while longer by allowing the layout inspector to explicitly vend this. * Better header, thanks @maicki! --- AsyncDisplayKit/ASCollectionView.mm | 33 +++++++++---------- .../ASCollectionViewFlowLayoutInspector.h | 6 ++++ .../ASCollectionViewFlowLayoutInspector.m | 5 +++ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/AsyncDisplayKit/ASCollectionView.mm b/AsyncDisplayKit/ASCollectionView.mm index 8c79a019fe..cc0d5b16a3 100644 --- a/AsyncDisplayKit/ASCollectionView.mm +++ b/AsyncDisplayKit/ASCollectionView.mm @@ -178,6 +178,7 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; struct { unsigned int layoutInspectorDidChangeCollectionViewDataSource:1; unsigned int layoutInspectorDidChangeCollectionViewDelegate:1; + unsigned int layoutInspectorScrollableDirections:1; } _layoutInspectorFlags; } @@ -454,6 +455,7 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; _layoutInspectorFlags.layoutInspectorDidChangeCollectionViewDataSource = [_layoutInspector respondsToSelector:@selector(didChangeCollectionViewDataSource:)]; _layoutInspectorFlags.layoutInspectorDidChangeCollectionViewDelegate = [_layoutInspector respondsToSelector:@selector(didChangeCollectionViewDelegate:)]; + _layoutInspectorFlags.layoutInspectorScrollableDirections = [_layoutInspector respondsToSelector:@selector(scrollableDirections)]; } - (void)setTuningParameters:(ASRangeTuningParameters)tuningParameters forRangeType:(ASLayoutRangeType)rangeType @@ -844,10 +846,20 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; - (ASScrollDirection)scrollableDirections { - if ([self.collectionViewLayout asdk_isFlowLayout]) { - return [self flowLayoutScrollableDirections:(UICollectionViewFlowLayout *)self.collectionViewLayout]; + if (_layoutInspectorFlags.layoutInspectorScrollableDirections) { + return [self.layoutInspector scrollableDirections]; } else { - return [self nonFlowLayoutScrollableDirections]; + 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; } } @@ -855,21 +867,6 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; return (flowLayout.scrollDirection == UICollectionViewScrollDirectionHorizontal) ? ASScrollDirectionHorizontalDirections : ASScrollDirectionVerticalDirections; } -- (ASScrollDirection)nonFlowLayoutScrollableDirections -{ - 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; -} - - (void)layoutSubviews { if (_zeroContentInsets) { diff --git a/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.h b/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.h index 0dafa8cbff..e0e560ecf8 100644 --- a/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.h +++ b/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.h @@ -12,6 +12,7 @@ #import #import +#import @class ASCollectionView; @protocol ASCollectionDataSource; @@ -52,6 +53,11 @@ 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 4fa8abdb2d..aa546b17c6 100644 --- a/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.m +++ b/AsyncDisplayKit/Details/ASCollectionViewFlowLayoutInspector.m @@ -176,6 +176,11 @@ static inline ASSizeRange NodeConstrainedSizeForScrollDirection(ASCollectionView return [self layoutHasSupplementaryViewOfKind:kind inSection:section collectionView:collectionView] ? 1 : 0; } +- (ASScrollDirection)scrollableDirections +{ + return (self.layout.scrollDirection == UICollectionViewScrollDirectionHorizontal) ? ASScrollDirectionHorizontalDirections : ASScrollDirectionVerticalDirections; +} + #pragma mark - Private helpers - (CGSize)sizeForSupplementaryViewOfKind:(NSString *)kind inSection:(NSUInteger)section collectionView:(ASCollectionView *)collectionView