From f7c81bae9d44aeb448200bfe403ee47738d7ff6a Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Thu, 22 Jun 2017 10:55:26 -0400 Subject: [PATCH] =?UTF-8?q?Show=20the=20=E2=80=9Cscroll=20down=E2=80=9D=20?= =?UTF-8?q?button=20if=20user=20scrolls=20up,=20even=20if=20there=20are=20?= =?UTF-8?q?no=20unread=20messages.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit // FREEBIE --- .../ConversationView/MessagesViewController.m | 18 ++++++++++++++++-- .../OWSMessagesComposerTextView.h | 2 +- .../OWSMessagesComposerTextView.m | 6 +++--- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Signal/src/ViewControllers/ConversationView/MessagesViewController.m b/Signal/src/ViewControllers/ConversationView/MessagesViewController.m index cfcb01673..464747b0e 100644 --- a/Signal/src/ViewControllers/ConversationView/MessagesViewController.m +++ b/Signal/src/ViewControllers/ConversationView/MessagesViewController.m @@ -2793,6 +2793,7 @@ typedef enum : NSUInteger { [super viewDidLayoutSubviews]; [self updateLastVisibleTimestamp]; + [self ensureScrollDownButton]; } - (void)createScrollDownButton @@ -2838,6 +2839,14 @@ typedef enum : NSUInteger { BOOL shouldShowScrollDownButton = NO; NSUInteger numberOfMessages = [self.messageMappings numberOfItemsInSection:0]; + CGFloat scrollSpaceToBottom = (self.collectionView.contentSize.height + self.collectionView.contentInset.bottom + - (self.collectionView.contentOffset.y + self.collectionView.frame.size.height)); + CGFloat pageHeight = (self.collectionView.frame.size.height + - (self.collectionView.contentInset.top + self.collectionView.contentInset.bottom)); + // Show "scroll down" button if user is scrolled up at least + // one page. + BOOL isScrolledUp = scrollSpaceToBottom > pageHeight * 1.f; + if (numberOfMessages > 0) { TSInteraction *lastInteraction = [self interactionAtIndexPath:[NSIndexPath indexPathForRow:(NSInteger)numberOfMessages - 1 inSection:0]]; @@ -2845,6 +2854,8 @@ typedef enum : NSUInteger { if (lastInteraction.timestampForSorting > self.lastVisibleTimestamp) { shouldShowScrollDownButton = YES; + } else if (isScrolledUp) { + shouldShowScrollDownButton = YES; } } @@ -3992,7 +4003,7 @@ typedef enum : NSUInteger { [self presentViewController:controller animated:YES completion:nil]; } -- (void)textViewDidChangePosition +- (void)textViewDidChangeLayout { OWSAssert([NSThread isMainThread]); @@ -4006,6 +4017,8 @@ typedef enum : NSUInteger { userInfo:nil repeats:NO]; } + + [self ensureScrollDownButton]; } - (void)scrollToBottomImmediately @@ -4096,6 +4109,8 @@ typedef enum : NSUInteger { // We want to show the "voice message" button if the text input is empty // and the "send" button if it isn't. [((OWSMessagesToolbarContentView *)self.inputToolbar.contentView)ensureEnabling]; + + [self ensureScrollDownButton]; } #pragma mark - UIScrollViewDelegate @@ -4162,7 +4177,6 @@ typedef enum : NSUInteger { #pragma mark - OWSMessagesCollectionViewFlowLayoutDelegate - - (BOOL)shouldShowCellDecorationsAtIndexPath:(NSIndexPath *)indexPath { TSInteraction *interaction = [self interactionAtIndexPath:indexPath]; diff --git a/Signal/src/ViewControllers/ConversationView/OWSMessagesComposerTextView.h b/Signal/src/ViewControllers/ConversationView/OWSMessagesComposerTextView.h index e25b6dbc5..8a2ef7f3a 100644 --- a/Signal/src/ViewControllers/ConversationView/OWSMessagesComposerTextView.h +++ b/Signal/src/ViewControllers/ConversationView/OWSMessagesComposerTextView.h @@ -12,7 +12,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)didPasteAttachment:(SignalAttachment *_Nullable)attachment; -- (void)textViewDidChangePosition; +- (void)textViewDidChangeLayout; @end diff --git a/Signal/src/ViewControllers/ConversationView/OWSMessagesComposerTextView.m b/Signal/src/ViewControllers/ConversationView/OWSMessagesComposerTextView.m index 077ce03f8..d0d245636 100644 --- a/Signal/src/ViewControllers/ConversationView/OWSMessagesComposerTextView.m +++ b/Signal/src/ViewControllers/ConversationView/OWSMessagesComposerTextView.m @@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN BOOL becameFirstResponder = [super becomeFirstResponder]; if (becameFirstResponder) { // Intercept to scroll to bottom when text view is tapped. - [self.textViewPasteDelegate textViewDidChangePosition]; + [self.textViewPasteDelegate textViewDidChangeLayout]; } return becameFirstResponder; } @@ -61,7 +61,7 @@ NS_ASSUME_NONNULL_BEGIN [super setFrame:frame]; if (didChangeSize && isNonEmpty) { - [self.textViewPasteDelegate textViewDidChangePosition]; + [self.textViewPasteDelegate textViewDidChangeLayout]; } } @@ -73,7 +73,7 @@ NS_ASSUME_NONNULL_BEGIN [super setBounds:bounds]; if (didChangeSize && isNonEmpty) { - [self.textViewPasteDelegate textViewDidChangePosition]; + [self.textViewPasteDelegate textViewDidChangeLayout]; } }