Я пытаюсь создать пользовательский интерфейс приложения чата, идея макета была довольно простой:
Когда фокусировалась панель ввода, клавиатура появляется и «выдвигает» панель чата, так как это сетка, ListView изменит размер, чтобы соответствовать экрану:
Я обновляюполе строки ввода, чтобы «подтолкнуть» его вверх:
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 также изменил размер, как и ожидалось, однакодве проблемы, о которых я понятия не имел, как ее решить:
- Как сохранить положение прокрутки ListView после изменения размера?
- Отсутствие анимации для увеличения представления
У меня есть поиск по сети, я пробовал IQKeyboardManager и KeyboardOverLap. Анимация push up хороша и плавна, однако происходят странные вещи:
https://drive.google.com/file/d/1Zm0lMKB3wq07ve67wlcvLuNM_6Waad7R/view?usp=sharing
- Вместо изменения размера ListView, этот подход подтолкнуть весь ListView вверх, чтобы я не мог видеть первые несколько элементовможно прокрутить полосу прокрутки за пределы экрана
- Дополнительные странные пробелы в нижней части 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);
}
}