Deconflict "bottom view" layout and keyboard animations.

pull/2/head
Matthew Chen 5 years ago
parent 6e7c135348
commit 6fe3ce6d87

@ -214,6 +214,7 @@ typedef enum : NSUInteger {
@property (nonatomic) BOOL isViewCompletelyAppeared; @property (nonatomic) BOOL isViewCompletelyAppeared;
@property (nonatomic) BOOL isViewVisible; @property (nonatomic) BOOL isViewVisible;
@property (nonatomic) BOOL shouldObserveVMUpdates; @property (nonatomic) BOOL shouldObserveVMUpdates;
@property (nonatomic) BOOL shouldAnimateKeyboardChanges;
@property (nonatomic) BOOL viewHasEverAppeared; @property (nonatomic) BOOL viewHasEverAppeared;
@property (nonatomic) BOOL hasUnreadMessages; @property (nonatomic) BOOL hasUnreadMessages;
@property (nonatomic) BOOL isPickingMediaAsDocument; @property (nonatomic) BOOL isPickingMediaAsDocument;
@ -1230,6 +1231,7 @@ typedef enum : NSUInteger {
self.isViewCompletelyAppeared = YES; self.isViewCompletelyAppeared = YES;
self.viewHasEverAppeared = YES; self.viewHasEverAppeared = YES;
self.shouldAnimateKeyboardChanges = YES;
// HACK: Because the inputToolbar is the inputAccessoryView, we make some special considertations WRT it's firstResponder status. // HACK: Because the inputToolbar is the inputAccessoryView, we make some special considertations WRT it's firstResponder status.
// //
@ -1291,6 +1293,7 @@ typedef enum : NSUInteger {
[super viewDidDisappear:animated]; [super viewDidDisappear:animated];
self.userHasScrolled = NO; self.userHasScrolled = NO;
self.isViewVisible = NO; self.isViewVisible = NO;
self.shouldAnimateKeyboardChanges = NO;
[self.audioAttachmentPlayer stop]; [self.audioAttachmentPlayer stop];
self.audioAttachmentPlayer = nil; self.audioAttachmentPlayer = nil;
@ -3720,12 +3723,21 @@ typedef enum : NSUInteger {
return; return;
} }
CGRect keyboardEndFrame = [keyboardEndFrameValue CGRectValue]; CGRect keyboardEndFrame = [keyboardEndFrameValue CGRectValue];
CGRect keyboardEndFrameConverted = [self.view convertRect:keyboardEndFrame fromView:nil];
UIEdgeInsets oldInsets = self.collectionView.contentInset; UIEdgeInsets oldInsets = self.collectionView.contentInset;
UIEdgeInsets newInsets = oldInsets; UIEdgeInsets newInsets = oldInsets;
// bottomLayoutGuide accounts for extra offset needed on iPhoneX // Use a content inset that so that the conversation content
newInsets.bottom = keyboardEndFrame.size.height - self.bottomLayoutGuide.length; // is not hidden behind the keyboard + input accessory.
//
// Make sure to leave space for the bottom layout guide (the notch).
//
// Always reserve room for the input accessory, which we display even
// if the keyboard is not active.
newInsets.bottom = MAX(0,
MAX(self.view.height - self.bottomLayoutGuide.length - keyboardEndFrameConverted.origin.y,
self.inputToolbar.height));
BOOL wasScrolledToBottom = [self isScrolledToBottom]; BOOL wasScrolledToBottom = [self isScrolledToBottom];
@ -3774,7 +3786,7 @@ typedef enum : NSUInteger {
} }
}; };
if (self.isViewCompletelyAppeared) { if (self.shouldAnimateKeyboardChanges && CurrentAppContext().isAppForegroundAndActive) {
adjustInsets(); adjustInsets();
} else { } else {
// Even though we are scrolling without explicitly animating, the notification seems to occur within the context // Even though we are scrolling without explicitly animating, the notification seems to occur within the context

@ -208,16 +208,19 @@ UIInterfaceOrientationMask DefaultUIInterfaceOrientationMask(void)
// We want to suppress those animations if the view isn't visible, // We want to suppress those animations if the view isn't visible,
// otherwise presentation animations don't work properly. // otherwise presentation animations don't work properly.
dispatch_block_t updateLayout = ^{ dispatch_block_t updateLayout = ^{
if (self.shouldBottomViewReserveSpaceForKeyboard) { if (self.shouldBottomViewReserveSpaceForKeyboard && offset >= 0) {
self.bottomLayoutConstraint.constant = MIN(self.bottomLayoutConstraint.constant, offset); // To avoid unnecessary animations / layout jitter,
} else { // some views never reclaim layout space when the keyboard is dismissed.
self.bottomLayoutConstraint.constant = offset; //
// They _do_ need to relayout if the user switches keyboards.
return;
} }
self.bottomLayoutConstraint.constant = offset;
[self.bottomLayoutView.superview layoutIfNeeded]; [self.bottomLayoutView.superview layoutIfNeeded];
}; };
if (self.shouldAnimateBottomLayout) { if (self.shouldAnimateBottomLayout && CurrentAppContext().isAppForegroundAndActive) {
updateLayout(); updateLayout();
} else { } else {
[UIView performWithoutAnimation:updateLayout]; [UIView performWithoutAnimation:updateLayout];

Loading…
Cancel
Save