diff --git a/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.iOS.cs b/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.iOS.cs index 2837e13b0a44..a7044fcb97a5 100644 --- a/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.iOS.cs +++ b/src/Core/src/Hosting/LifecycleEvents/AppHostBuilderExtensions.iOS.cs @@ -19,7 +19,8 @@ static void OnConfigureLifeCycle(IiOSLifecycleBuilder iOS) .OnPlatformWindowCreated((window) => { window.GetWindow()?.Created(); - KeyboardAutoManagerScroll.Connect(); + if (!KeyboardAutoManagerScroll.ShouldDisconnectLifecycle) + KeyboardAutoManagerScroll.Connect(); }) .WillTerminate(app => { diff --git a/src/Core/src/Platform/iOS/KeyboardAutoManagerScroll.cs b/src/Core/src/Platform/iOS/KeyboardAutoManagerScroll.cs index 69d484258830..66c26edd9ddb 100644 --- a/src/Core/src/Platform/iOS/KeyboardAutoManagerScroll.cs +++ b/src/Core/src/Platform/iOS/KeyboardAutoManagerScroll.cs @@ -32,13 +32,22 @@ public static class KeyboardAutoManagerScroll static CGRect? CursorRect = null; internal static bool IsKeyboardShowing = false; static int TextViewTopDistance = 20; - static int DebounceCount = 0; - static NSObject? WillShowToken = null; - static NSObject? WillHideToken = null; - static NSObject? DidHideToken = null; - static NSObject? TextFieldToken = null; - static NSObject? TextViewToken = null; - + static int DebounceCount; + static NSObject? WillShowToken; + static NSObject? WillHideToken; + static NSObject? DidHideToken; + static NSObject? TextFieldToken; + static NSObject? TextViewToken; + internal static bool ShouldDisconnectLifecycle; + + /// + /// Enables automatic scrolling with keyboard interactions on iOS devices. + /// + /// + /// This method is being called by default on iOS and will scroll the page when the keyboard + /// comes up. Call the method 'KeyboardAutoManagerScroll.Disconnect()' + /// to remove this scrolling behavior. + /// public static void Connect() { if (TextFieldToken is not null) @@ -55,8 +64,18 @@ public static void Connect() DidHideToken = NSNotificationCenter.DefaultCenter.AddObserver(new NSString("UIKeyboardDidHideNotification"), DidHideKeyboard); } + /// + /// Disables automatic scrolling with keyboard interactions on iOS devices. + /// + /// + /// When this method is called, scrolling will not automatically happen when the keyboard comes up. + /// public static void Disconnect() { + // if Disconnect is called prior to Connect, signal to not + // Connect during the Created Lifecycle event + ShouldDisconnectLifecycle = true; + if (WillShowToken is not null) { NSNotificationCenter.DefaultCenter.RemoveObserver(WillShowToken);