From 6b881b9efe6da3faf647936c64f63a5a468b9526 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 7 Jan 2019 14:37:08 -0500 Subject: [PATCH 1/3] Fix edge cases in conversation view scroll continuity. --- .../ConversationViewController.m | 59 +++++++++++++++---- 1 file changed, 49 insertions(+), 10 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 059dc3f46..065178494 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -101,6 +101,11 @@ typedef enum : NSUInteger { kMediaTypeVideo, } kMediaTypes; +typedef enum : NSUInteger { + kScrollBiasBottom = 0, + kScrollBiasTop, +} ScrollBias; + #pragma mark - @interface ConversationViewController () Date: Mon, 7 Jan 2019 14:57:38 -0500 Subject: [PATCH 2/3] Fix edge cases in conversation view scroll continuity. --- .../ConversationViewController.m | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index 065178494..a6b00d4a4 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -203,6 +203,7 @@ typedef enum : NSUInteger { @property (nonatomic) CGFloat scrollDistanceToBottomSnapshot; @property (nonatomic, nullable) NSNumber *lastKnownDistanceFromBottom; @property (nonatomic) ScrollBias scrollBias; +@property (nonatomic, nullable) NSTimer *autoLoadMoreTimer; @end @@ -475,6 +476,7 @@ typedef enum : NSUInteger { - (void)dealloc { [self.reloadTimer invalidate]; + [self.autoLoadMoreTimer invalidate]; } - (void)reloadTimerDidFire @@ -3774,10 +3776,17 @@ typedef enum : NSUInteger { [self updateLastVisibleSortId]; - __weak ConversationViewController *weakSelf = self; - dispatch_async(dispatch_get_main_queue(), ^{ - [weakSelf autoLoadMoreIfNecessary]; - }); + [self.autoLoadMoreTimer invalidate]; + self.autoLoadMoreTimer = [NSTimer weakScheduledTimerWithTimeInterval:0.1f + target:self + selector:@selector(autoLoadMoreTimerDidFire) + userInfo:nil + repeats:NO]; +} + +- (void)autoLoadMoreTimerDidFire +{ + [self autoLoadMoreIfNecessary]; } - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView From 7df17251a2920d29eb7523852f4137596a73dcd0 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Mon, 7 Jan 2019 15:08:16 -0500 Subject: [PATCH 3/3] Fix edge cases in conversation view scroll continuity. --- .../ConversationViewController.m | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index a6b00d4a4..ae45b636e 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -102,9 +102,9 @@ typedef enum : NSUInteger { } kMediaTypes; typedef enum : NSUInteger { - kScrollBiasBottom = 0, - kScrollBiasTop, -} ScrollBias; + kScrollContinuityBottom = 0, + kScrollContinuityTop, +} ScrollContinuity; #pragma mark - @@ -202,7 +202,7 @@ typedef enum : NSUInteger { @property (nonatomic) CGFloat scrollDistanceToBottomSnapshot; @property (nonatomic, nullable) NSNumber *lastKnownDistanceFromBottom; -@property (nonatomic) ScrollBias scrollBias; +@property (nonatomic) ScrollContinuity scrollContinuity; @property (nonatomic, nullable) NSTimer *autoLoadMoreTimer; @end @@ -247,7 +247,7 @@ typedef enum : NSUInteger { NSString *audioActivityDescription = [NSString stringWithFormat:@"%@ voice note", self.logTag]; _recordVoiceNoteAudioActivity = [[OWSAudioActivity alloc] initWithAudioDescription:audioActivityDescription behavior:OWSAudioBehavior_PlayAndRecord]; - self.scrollBias = kScrollBiasBottom; + self.scrollContinuity = kScrollContinuityBottom; } #pragma mark - Dependencies @@ -810,7 +810,7 @@ typedef enum : NSUInteger { - (void)resetContentAndLayout { - self.scrollBias = kScrollBiasBottom; + self.scrollContinuity = kScrollContinuityBottom; // Avoid layout corrupt issues and out-of-date message subtitles. self.lastReloadDate = [NSDate new]; [self.conversationViewModel viewDidResetContentAndLayout]; @@ -4282,7 +4282,7 @@ typedef enum : NSUInteger { - (CGPoint)collectionView:(UICollectionView *)collectionView targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset { - if (self.scrollBias == kScrollBiasBottom && self.lastKnownDistanceFromBottom) { + if (self.scrollContinuity == kScrollContinuityBottom && self.lastKnownDistanceFromBottom) { // Adjust the content offset to reflect the "last known" distance // from the bottom of the content. CGFloat contentOffsetYBottom = self.maxContentOffsetY; @@ -4558,7 +4558,7 @@ typedef enum : NSUInteger { // if the user is inserting new interactions. __block BOOL scrollToBottom = NO; - self.scrollBias = ([self isScrolledToBottom] ? kScrollBiasBottom : kScrollBiasTop); + self.scrollContinuity = ([self isScrolledToBottom] ? kScrollContinuityBottom : kScrollContinuityTop); void (^batchUpdates)(void) = ^{ OWSAssertIsOnMainThread(); @@ -4701,8 +4701,6 @@ typedef enum : NSUInteger { // We want to restore the current scroll state after we update the range, update // the dynamic interactions and re-layout. Here we take a "before" snapshot. self.scrollDistanceToBottomSnapshot = self.safeContentHeight - self.collectionView.contentOffset.y; - - self.scrollBias = kScrollBiasBottom; } - (void)conversationViewModelDidLoadMoreItems