From 39cd3afa0db5d1ca28d59e749fe7d44e627ac076 Mon Sep 17 00:00:00 2001 From: Samuel Hsiung Date: Thu, 28 Jan 2016 15:35:16 -0800 Subject: [PATCH] [AS(Table|Collection)View] make scrollDirection transform aware --- AsyncDisplayKit/ASCollectionView.mm | 4 ++- AsyncDisplayKit/ASTableView.mm | 3 ++- AsyncDisplayKit/Details/ASScrollDirection.h | 3 +++ AsyncDisplayKit/Details/ASScrollDirection.m | 27 +++++++++++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/AsyncDisplayKit/ASCollectionView.mm b/AsyncDisplayKit/ASCollectionView.mm index cefb45df04..523d8f9f8f 100644 --- a/AsyncDisplayKit/ASCollectionView.mm +++ b/AsyncDisplayKit/ASCollectionView.mm @@ -524,7 +524,9 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; } else { scrollVelocity = _deceleratingVelocity; } - return [self _scrollDirectionForVelocity:scrollVelocity]; + + ASScrollDirection scrollDirection = [self _scrollDirectionForVelocity:scrollVelocity]; + return ASScrollDirectionApplyTransform(scrollDirection, self.transform); } - (ASScrollDirection)_scrollDirectionForVelocity:(CGPoint)scrollVelocity diff --git a/AsyncDisplayKit/ASTableView.mm b/AsyncDisplayKit/ASTableView.mm index a28522a3a0..31cbab7a77 100644 --- a/AsyncDisplayKit/ASTableView.mm +++ b/AsyncDisplayKit/ASTableView.mm @@ -571,7 +571,8 @@ static NSString * const kCellReuseIdentifier = @"_ASTableViewCell"; } else { scrollVelocity = _deceleratingVelocity; } - return [self _scrollDirectionForVelocity:scrollVelocity]; + ASScrollDirection scrollDirection = [self _scrollDirectionForVelocity:scrollVelocity]; + return ASScrollDirectionApplyTransform(scrollDirection, self.transform); } - (ASScrollDirection)_scrollDirectionForVelocity:(CGPoint)velocity diff --git a/AsyncDisplayKit/Details/ASScrollDirection.h b/AsyncDisplayKit/Details/ASScrollDirection.h index 2d75703d69..d0192e1408 100644 --- a/AsyncDisplayKit/Details/ASScrollDirection.h +++ b/AsyncDisplayKit/Details/ASScrollDirection.h @@ -10,6 +10,8 @@ #import "ASBaseDefines.h" +#include + NS_ASSUME_NONNULL_BEGIN typedef NS_OPTIONS(NSInteger, ASScrollDirection) { @@ -32,6 +34,7 @@ BOOL ASScrollDirectionContainsRight(ASScrollDirection scrollDirection); BOOL ASScrollDirectionContainsLeft(ASScrollDirection scrollDirection); BOOL ASScrollDirectionContainsUp(ASScrollDirection scrollDirection); BOOL ASScrollDirectionContainsDown(ASScrollDirection scrollDirection); +ASScrollDirection ASScrollDirectionApplyTransform(ASScrollDirection scrollDirection, CGAffineTransform transform); ASDISPLAYNODE_EXTERN_C_END diff --git a/AsyncDisplayKit/Details/ASScrollDirection.m b/AsyncDisplayKit/Details/ASScrollDirection.m index 40698d4279..778eabffbb 100644 --- a/AsyncDisplayKit/Details/ASScrollDirection.m +++ b/AsyncDisplayKit/Details/ASScrollDirection.m @@ -34,3 +34,30 @@ BOOL ASScrollDirectionContainsUp(ASScrollDirection scrollDirection) { BOOL ASScrollDirectionContainsDown(ASScrollDirection scrollDirection) { return (scrollDirection & ASScrollDirectionDown) != 0; } + +ASScrollDirection ASScrollDirectionInvertHorizontally(ASScrollDirection scrollDirection) { + if (scrollDirection == ASScrollDirectionRight) { + return ASScrollDirectionLeft; + } else if (scrollDirection == ASScrollDirectionLeft) { + return ASScrollDirectionRight; + } + return scrollDirection; +} + +ASScrollDirection ASScrollDirectionInvertVertically(ASScrollDirection scrollDirection) { + if (scrollDirection == ASScrollDirectionUp) { + return ASScrollDirectionDown; + } else if (scrollDirection == ASScrollDirectionDown) { + return ASScrollDirectionUp; + } + return scrollDirection; +} + +ASScrollDirection ASScrollDirectionApplyTransform(ASScrollDirection scrollDirection, CGAffineTransform transform) { + if ((transform.a < 0) && ASScrollDirectionContainsHorizontalDirection(scrollDirection)) { + return ASScrollDirectionInvertHorizontally(scrollDirection); + } else if ((transform.d < 0) && ASScrollDirectionContainsVerticalDirection(scrollDirection)) { + return ASScrollDirectionInvertVertically(scrollDirection); + } + return scrollDirection; +}