From 1fba62da0eff538794c17fc20f9d64c96944b071 Mon Sep 17 00:00:00 2001 From: Max Gu Date: Thu, 24 Mar 2016 14:50:08 -0700 Subject: [PATCH] Adding scrollViewWillBeginDragging and scrollViewDidEndDragging callbac to ASCellNode instances --- AsyncDisplayKit/ASCellNode.h | 8 ++++++ AsyncDisplayKit/ASCollectionView.mm | 30 +++++++++++++++++++++++ AsyncDisplayKit/Details/ASDelegateProxy.m | 8 ++++++ 3 files changed, 46 insertions(+) diff --git a/AsyncDisplayKit/ASCellNode.h b/AsyncDisplayKit/ASCellNode.h index 6e11c859..6f3dc043 100644 --- a/AsyncDisplayKit/ASCellNode.h +++ b/AsyncDisplayKit/ASCellNode.h @@ -30,6 +30,14 @@ typedef NS_ENUM(NSUInteger, ASCellNodeVisibilityEvent) { * Indicates a cell is no longer visible */ ASCellNodeVisibilityEventInvisible, + /** + * Indicates user has started dragging the visible cell + */ + ASCellNodeVisibilityEventWillBeginDragging, + /** + * Indicates user has ended dragging the visible cell + */ + ASCellNodeVisibilityEventDidEndDragging, }; /** diff --git a/AsyncDisplayKit/ASCollectionView.mm b/AsyncDisplayKit/ASCollectionView.mm index ae1f5792..ab815e50 100644 --- a/AsyncDisplayKit/ASCollectionView.mm +++ b/AsyncDisplayKit/ASCollectionView.mm @@ -107,6 +107,8 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; BOOL _asyncDataFetchingEnabled; BOOL _asyncDelegateImplementsScrollviewDidScroll; + BOOL _asyncDelegateImplementsWillBeginDragging; + BOOL _asyncDelegateImplementsDidEndDragging; BOOL _asyncDataSourceImplementsConstrainedSizeForNode; BOOL _asyncDataSourceImplementsNodeBlockForItemAtIndexPath; _ASCollectionViewNodeSizeInvalidationContext *_queuedNodeSizeInvalidationContext; // Main thread only @@ -364,10 +366,14 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; _asyncDelegate = nil; _proxyDelegate = _isDeallocating ? nil : [[ASCollectionViewProxy alloc] initWithTarget:nil interceptor:self]; _asyncDelegateImplementsScrollviewDidScroll = NO; + _asyncDelegateImplementsWillBeginDragging = NO; + _asyncDelegateImplementsDidEndDragging = NO; } else { _asyncDelegate = asyncDelegate; _proxyDelegate = [[ASCollectionViewProxy alloc] initWithTarget:_asyncDelegate interceptor:self]; _asyncDelegateImplementsScrollviewDidScroll = ([_asyncDelegate respondsToSelector:@selector(scrollViewDidScroll:)] ? 1 : 0); + _asyncDelegateImplementsWillBeginDragging = ([_asyncDelegate respondsToSelector:@selector(scrollViewWillBeginDragging:)] ? 1 : 0); + _asyncDelegateImplementsDidEndDragging = ([_asyncDelegate respondsToSelector:@selector(scrollViewDidEndDragging:willDecelerate:)] ? 1 : 0); } super.delegate = (id)_proxyDelegate; @@ -738,6 +744,30 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; } } +- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView +{ + for (_ASCollectionViewCell *collectionCell in _cellsForVisibilityUpdates) { + [[collectionCell node] cellNodeVisibilityEvent:ASCellNodeVisibilityEventWillBeginDragging + inScrollView:scrollView + withCellFrame:collectionCell.frame]; + } + if (_asyncDelegateImplementsWillBeginDragging) { + [_asyncDelegate scrollViewWillBeginDragging:scrollView]; + } +} + +- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate +{ + for (_ASCollectionViewCell *collectionCell in _cellsForVisibilityUpdates) { + [[collectionCell node] cellNodeVisibilityEvent:ASCellNodeVisibilityEventDidEndDragging + inScrollView:scrollView + withCellFrame:collectionCell.frame]; + } + if (_asyncDelegateImplementsDidEndDragging) { + [_asyncDelegate scrollViewDidEndDragging:scrollView willDecelerate:decelerate]; + } +} + - (BOOL)shouldBatchFetch { // if the delegate does not respond to this method, there is no point in starting to fetch diff --git a/AsyncDisplayKit/Details/ASDelegateProxy.m b/AsyncDisplayKit/Details/ASDelegateProxy.m index 3034a83d..032de4c6 100644 --- a/AsyncDisplayKit/Details/ASDelegateProxy.m +++ b/AsyncDisplayKit/Details/ASDelegateProxy.m @@ -27,6 +27,10 @@ // used for ASCellNode visibility selector == @selector(scrollViewDidScroll:) || + // used for ASCellNode user interaction + selector == @selector(scrollViewWillBeginDragging:) || + selector == @selector(scrollViewDidEndDragging:willDecelerate:) || + // used for ASRangeController visibility updates selector == @selector(tableView:willDisplayCell:forRowAtIndexPath:) || selector == @selector(tableView:didEndDisplayingCell:forRowAtIndexPath:) || @@ -62,6 +66,10 @@ // used for ASCellNode visibility selector == @selector(scrollViewDidScroll:) || + // used for ASCellNode user interaction + selector == @selector(scrollViewWillBeginDragging:) || + selector == @selector(scrollViewDidEndDragging:willDecelerate:) || + // intercepted due to not being supported by ASCollectionView (prevent bugs caused by usage) selector == @selector(collectionView:canMoveItemAtIndexPath:) || selector == @selector(collectionView:moveItemAtIndexPath:toIndexPath:) ||