Revise scrolling behavior of messages view.

// FREEBIE
This commit is contained in:
Matthew Chen 2017-05-16 14:04:44 -04:00
parent 4e1dda275d
commit c639926f2c
1 changed files with 25 additions and 6 deletions

View File

@ -150,22 +150,24 @@ typedef enum : NSUInteger {
- (void)setFrame:(CGRect)frame
{
BOOL isNonEmpty = (self.width > 0.f && self.height > 0.f);
BOOL didChangeSize = !CGSizeEqualToSize(frame.size, self.frame.size);
[super setFrame:frame];
if (didChangeSize) {
if (didChangeSize && isNonEmpty) {
[self.textViewPasteDelegate textViewDidChangeSize];
}
}
- (void)setBounds:(CGRect)bounds
{
BOOL isNonEmpty = (self.width > 0.f && self.height > 0.f);
BOOL didChangeSize = !CGSizeEqualToSize(bounds.size, self.bounds.size);
[super setBounds:bounds];
if (didChangeSize) {
if (didChangeSize && isNonEmpty) {
[self.textViewPasteDelegate textViewDidChangeSize];
}
}
@ -635,6 +637,7 @@ typedef enum : NSUInteger {
@property (nonatomic) NSCache *messageAdapterCache;
@property (nonatomic) BOOL userHasScrolled;
@property (nonatomic) NSDate *lastMessageSentDate;
@property (nonatomic) NSTimer *scrollToBottomTimer;
@end
@ -999,6 +1002,9 @@ typedef enum : NSUInteger {
- (void)scrollToDefaultPosition
{
[self.scrollToBottomTimer invalidate];
self.scrollToBottomTimer = nil;
NSIndexPath *_Nullable indexPath = [self indexPathOfUnreadMessagesIndicator];
if (indexPath) {
[self.collectionView scrollToItemAtIndexPath:indexPath
@ -3067,7 +3073,7 @@ typedef enum : NSUInteger {
if ([sectionChanges count] == 0 & [messageRowChanges count] == 0) {
return;
}
BOOL wasAtBottom = [self isScrolledToBottom];
// We want sending messages to feel snappy. So, if the only
// update is a new outgoing message AND we're already scrolled to
@ -3663,12 +3669,25 @@ typedef enum : NSUInteger {
BOOL wasAtBottom = [self isScrolledToBottom];
if (wasAtBottom) {
dispatch_async(dispatch_get_main_queue(), ^{
[self scrollToBottomAnimated:NO];
});
[self.scrollToBottomTimer invalidate];
self.scrollToBottomTimer = [NSTimer weakScheduledTimerWithTimeInterval:0.001f
target:self
selector:@selector(scrollToBottomImmediately)
userInfo:nil
repeats:NO];
}
}
- (void)scrollToBottomImmediately
{
OWSAssert([NSThread isMainThread]);
[self.scrollToBottomTimer invalidate];
self.scrollToBottomTimer = nil;
[self scrollToBottomAnimated:NO];
}
#pragma mark - OWSMessagesToolbarContentDelegate
- (void)voiceMemoGestureDidStart