From b38fce13fd8a5d7ea045a74078d312ab04e85333 Mon Sep 17 00:00:00 2001 From: Alexander Harding <2166114+aeharding@users.noreply.github.com> Date: Tue, 5 Nov 2024 19:34:36 -0600 Subject: [PATCH] fix(keyboard): Remove iOS keyboard delay (#1904) This fix aligns with the Android implementation of no delay. This fix removes all keyboard delay, including the 0.01 second delay for hiding. I believe this delay existed due to a slight flicker observed when setting delay to 0. However, by wrapping the height javascript logic in `requestAnimationFrame()` the flicker is no longer present. I believe this is a better solution than #2230 because it avoids adding animations. (Users can do this themselves by disabling resizing and hooking into keyboardWillShow, didShow, willHide, and didHide events in javascript.) It also avoids magic/arbitrary delay amounts, like 0.01. --- keyboard/ios/Sources/KeyboardPlugin/Keyboard.m | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/keyboard/ios/Sources/KeyboardPlugin/Keyboard.m b/keyboard/ios/Sources/KeyboardPlugin/Keyboard.m index 29c070840..076e12ea2 100644 --- a/keyboard/ios/Sources/KeyboardPlugin/Keyboard.m +++ b/keyboard/ios/Sources/KeyboardPlugin/Keyboard.m @@ -110,7 +110,7 @@ - (void)resetScrollView - (void)onKeyboardWillHide:(NSNotification *)notification { - [self setKeyboardHeight:0 delay:0.01]; + [self setKeyboardHeight:0 delay:0]; [self resetScrollView]; hideTimer = [NSTimer scheduledTimerWithTimeInterval:0 repeats:NO block:^(NSTimer * _Nonnull timer) { [self.bridge triggerWindowJSEventWithEventName:@"keyboardWillHide"]; @@ -142,8 +142,7 @@ - (void)onKeyboardWillShow:(NSNotification *)notification } } - double duration = [[notification.userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]+0.2; - [self setKeyboardHeight:height delay:duration]; + [self setKeyboardHeight:height delay:0]; [self resetScrollView]; NSString * data = [NSString stringWithFormat:@"{ 'keyboardHeight': %d }", (int)height]; @@ -199,7 +198,7 @@ - (void)resizeElement:(NSString *)element withPaddingBottom:(int)paddingBottom w height = screenHeight - paddingBottom; } - [self.bridge evalWithJs: [NSString stringWithFormat:@"(function() { var el = %@; var height = %d; if (el) { el.style.height = height > -1 ? height + 'px' : null; } })()", element, height]]; + [self.bridge evalWithJs: [NSString stringWithFormat:@"requestAnimationFrame(() => { var el = %@; var height = %d; if (el) { el.style.height = height > -1 ? height + 'px' : null; } })", element, height]]; } - (void)_updateFrame