Xamarin.form Перемещение вверх при появлении клавиатуры - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь создать пользовательский интерфейс приложения чата, идея макета была довольно простой:

enter image description here

Когда фокусировалась панель ввода, клавиатура появляется и «выдвигает» панель чата, так как это сетка, ListView изменит размер, чтобы соответствовать экрану:

enter image description here

Я обновляюполе строки ввода, чтобы «подтолкнуть» его вверх:

NSValue result = (NSValue)args.Notification.UserInfo.ObjectForKey(new NSString(UIKeyboard.FrameEndUserInfoKey));
CGSize keyboardSize = result.RectangleFValue.Size;
if (Element != null){
Element.Margin = new Thickness(0, 0, 0,keyboardSize.Height); //push the entry up to keyboard height when keyboard is activated
}

И вот результат: https://drive.google.com/file/d/1S9yQ6ks15BRH3hH0j_M8awpDJFRFitUi/view?usp=sharing

Представление увеличилось, и ListView также изменил размер, как и ожидалось, однакодве проблемы, о которых я понятия не имел, как ее решить:

  1. Как сохранить положение прокрутки ListView после изменения размера?
  2. Отсутствие анимации для увеличения представления

У меня есть поиск по сети, я пробовал IQKeyboardManager и KeyboardOverLap. Анимация push up хороша и плавна, однако происходят странные вещи:

https://drive.google.com/file/d/1Zm0lMKB3wq07ve67wlcvLuNM_6Waad7R/view?usp=sharing

  1. Вместо изменения размера ListView, этот подход подтолкнуть весь ListView вверх, чтобы я не мог видеть первые несколько элементовможно прокрутить полосу прокрутки за пределы экрана
  2. Дополнительные странные пробелы в нижней части ListView

Любая помощь будет оценена, спасибо!

Решение:

  void OnKeyboardShow(object sender, UIKeyboardEventArgs args)
    {
        NSValue result = (NSValue)args.Notification.UserInfo.ObjectForKey(new NSString(UIKeyboard.FrameEndUserInfoKey));
        CGSize keyboardSize = result.RectangleFValue.Size;
        if (Control != null)
        {
            int bottomMargin = 0;
            var sa = UIApplication.SharedApplication.KeyWindow.SafeAreaInsets;
            bottomMargin = (int)sa.Bottom;

            CGPoint offset = Control.ContentOffset;
            var difference = keyboardSize.Height - bottomMargin;

            if (Control.ContentSize.Height > Control.Frame.Height)
            {
                offset.Y += difference;
                Control.SetContentOffset(offset, true);
            }
            else if (Control.ContentSize.Height + keyboardSize.Height > Control.Frame.Height)
            {
                offset.Y += Control.ContentSize.Height + keyboardSize.Height - Control.Frame.Height - bottomMargin;
                Control.SetContentOffset(offset, true);
            }

            Control.ContentInset = new UIEdgeInsets(0, 0, difference, 0);
            Control.ScrollIndicatorInsets = Control.ContentInset;

        }

    }

    void OnKeyboardHide(object sender, UIKeyboardEventArgs args)
    {
        if (Control != null)
        {
            Control.ContentInset = new UIEdgeInsets(0, 0, 0, 0);
            Control.ScrollIndicatorInsets = new UIEdgeInsets(0, 0, 0, 0);
        }

    }

1 Ответ

0 голосов
/ 27 ноября 2018

Решение:

См. Следующий код

в iOS Custom Renderer

protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
{
  base.OnElementChanged(e);

  if(Control!=null)
  {
     Control.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag;

     NSNotificationCenter.DefaultCenter.AddObserver(this, new Selector("KeyBoardWillShow:"), new NSString("UIKeyboardWillShowNotification"), null);

     NSNotificationCenter.DefaultCenter.AddObserver(this, new Selector("KeyBoardWillHide:"), new NSString("UIKeyboardWillHideNotification"), null);

  }

}


[Export("KeyBoardWillShow:")]
void KeyBoardWillShow(NSNotification note)
{
  NSValue keyboardRect = (NSValue)note.UserInfo.ObjectForKey(new NSString(UIKeyboard.FrameEndUserInfoKey));
  Control.ContentInset = new UIEdgeInsets(0,0, keyboardRect.RectangleFValue.Size.Height,0);
}


[Export("KeyBoardWillHide:")]
void KeyBoardWillHide(NSNotification note)
{
  Control.ContentInset = UIEdgeInsets.Zero;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...