Cómo tratar la input superpuesta de keyboard de iOs cuando la página ya tiene una vista de desplazamiento en Xamarin Forms

Estoy teniendo un problema con el keyboard en iOS. Estoy desarrollando una página de chat en Xamarin, multiplataforma, y ​​esta página tiene un scrollView que permite al usuario desplazarse por los posts.

Existe un problema común con respecto al keyboard en iOS, donde cubre la input. iOS no sube la página automáticamente. Para resolver este problema, una solución simple es colocar una label "Scrollview" que cubra todo el código de la página. Esto generalmente funciona bien. Sin embargo, mi página ya tiene una scrollview dentro de ella. Por lo tanto, cuando pongo una vista de desplazamiento dentro de otra vista de desplazamiento, el comportamiento es un poco loco, incluso en Android. A veces se desplaza por la "vista de posts", a veces se desplaza por toda la página.

¿Hay una solución para evitar el problema del keyboard en iOS que no usa la label scrollview? ¿O hay una solución para usar una vista de desplazamiento dentro de otra vista de desplazamiento?

¿Alguna sugerencia?

¡Gracias de antemano!

Una forma en que puede lidiar con esto es un procesador de página personalizado [1] que desplaza toda la página hacia arriba cuando aparece el keyboard.

Aquí hay un código de ejemplo para hacer esto. Supongo que solo querrías hacer esto en páginas que lo necesiten, así que primero en el proyecto Forms PCL crea una subclass vacía de ContentPage por ejemplo, KeyboardInputContentPage (o lo que quieras):

 public class KeyboardInputContentPage : ContentPage {} 

A continuación, henetworkinga de KeyboardInputContentPage para las páginas reales que necesita esta funcionalidad, en mi testing la llamé TestKeyboardInputContentPage :

 public partial class TestKeyboardInputContentPage : KeyboardInputContentPage { public TestKeyboardInputContentPage() { InitializeComponent(); } //etc } 

Y el código de renderizador de página personalizado. Esto va en el proyecto de la aplicación iOS:

 [assembly: ExportRenderer(typeof(KeyboardInputContentPage), typeof(ContentPageRenderer))] namespace MyAppName.iOS { public class ContentPageRenderer : PageRenderer { private NSObject keyBoardWillShow; private NSObject keyBoardWillHide; private nfloat scrollAmout; private double animDuration; private UIViewAnimationCurve animCurve; private bool keyboardShowing; public override void ViewDidLoad() { base.ViewDidLoad(); keyBoardWillShow = UIKeyboard.Notifications.ObserveWillShow(KeyboardWillShow); keyBoardWillHide = UIKeyboard.Notifications.ObserveWillHide(KeyboardWillHide); } void KeyboardWillShow(object sender, UIKeyboardEventArgs args) { if (!keyboardShowing) { keyboardShowing = true; animDuration = args.AnimationDuration; animCurve = args.AnimationCurve; var r = UIKeyboard.FrameBeginFromNotification(args.Notification); scrollAmout = r.Height; ScrollTheView(true); } } void KeyboardWillHide(object sender, UIKeyboardEventArgs args) { if (keyboardShowing) { keyboardShowing = false; animDuration = args.AnimationDuration; animCurve = args.AnimationCurve; var r = UIKeyboard.FrameBeginFromNotification(args.Notification); scrollAmout = r.Height; ScrollTheView(false); } } private void ScrollTheView(bool scale) { UIView.BeginAnimations(string.Empty, IntPtr.Zero); UIView.SetAnimationDuration(animDuration); UIView.SetAnimationCurve(animCurve); var frame = View.Frame; if (scale) frame.Y -= scrollAmout; else frame.Y += scrollAmout; View.Frame = frame; UIView.CommitAnimations(); } } } 

Como este renderizador en realidad desplaza toda la página nativa hacia arriba y hacia atrás cuando el keyboard se muestra y se oculta, no debería importar cómo distribuya la página en Forms Xaml. Todo lo que importa es que su página de Formas henetworkinga de KeyboardInputContentPage .

¡Espero que esto ayude!

[1] https://developer.xamarin.com/guides/xamarin-forms/custom-renderer/contentpage/

Encontré el mismo problema al intentar implementar una function de chat en nuestra aplicación. Una solución es utilizar un renderizador personalizado para la Entry y ajustar su margen cuando se activa el evento del keyboard. Seguí el patrón establecido en esta publicación .

En este caso, inserto mi Entry en una ContentView , así que ViewRenderer un ViewRenderer para ajustar la ContentView . Dependiendo de la situación, el Renderer que henetworkinges puede variar. Sin embargo, en la mayoría de los casos, deberías poder restablecer el margen a la altura del keyboard.

 using System; using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; using HBIClientFacingApp; using HBIClientFacingApp.iOS; [assembly:ExportRenderer( typeof(ChatViewWithEntry), typeof(ChatEntryRenderer))] namespace YourNameSpace.iOS { public class ChatEntryRenderer : ViewRenderer //Depending on your situation, you will need to inherit from a different renderer { public ChatEntryRenderer() { UIKeyboard.Notifications.ObserveWillShow ((sender, args) => { if (Element != null) { Element.Margin = new Thickness(0,0,0, args.FrameEnd.Height); //push the entry up to keyboard height when keyboard is activated } }); UIKeyboard.Notifications.ObserveWillHide ((sender, args) => { if (Element != null) { Element.Margin = new Thickness(0); //set the margins to zero when keyboard is dismissed } }); } } }