Проблемы с пользовательским интерфейсом чата Nativescript для iOS

Я создаю интерфейс чата в Nativescript, и у меня почти все работает, но у меня есть несколько проблем в iOS, которые я не могу понять. В Android все работает корректно.

Проблема 1:

  • Когда я сосредотачиваюсь на TextView и открывается клавиатура, я больше не могу прокручивать до верхней части чата. Кажется, что весь контент сдвигается вверх (даже без использования IQKeyboardManager достаточно интересно).

Проблема 2:

  • Когда я начинаю печатать в TextView, он мгновенно перемещается в нижнюю часть экрана, скрытый за клавиатурой, и я не вижу, что печатаю.

Вот демонстрационный проект, который я создал на Playground, который показывает проблему. Демо-проект Playground

Ниже представлен GIF-файл, в котором показаны обе проблемы.

Любая помощь приветствуется. Спасибо!

Демонстрация пользовательского интерфейса чата


person keerl    schedule 14.05.2020    source источник
comment
IQKeyboardManager обертывает все ваше представление в ScrollView, поэтому ваш TextView может быть вверху / видимым, ListView находится в собственном контейнере, поэтому он не полностью виден. Возможно, вы захотите использовать плагин панели инструментов клавиатуры, по крайней мере, для iOS.   -  person Manoj    schedule 15.05.2020
comment
Я использую IQKeyboardManager в своем локальном проекте, я не могу понять, как добавить его в Playground. Я добавил пакет NPM, но вроде ничего не изменилось (по крайней мере, в Playground). Локально ошибка немного меняется, когда я использую IQKeyboardManager. Я могу набирать текст без его исчезновения, но то же самое происходит, когда я нажимаю «Отправить».   -  person keerl    schedule 15.05.2020


Ответы (1)


Проблема 1:

Это связано с тем, что IQKeyboardManager размещает ScrollView поверх ViewController (Page), а RadListView имеет свою собственную прокручиваемую область. Решением будет настройка вставок, когда клавиатура активна.

Приведенный ниже код принимает высоту клавиатуры и кэширует ее в объекте приложения при первом отображении.

import * as application from "@nativescript/core/application";

let observer = application.ios.addNotificationObserver(
    UIKeyboardDidShowNotification,
    notification => {
        application.ios.removeNotificationObserver(
            observer,
            UIKeyboardDidShowNotification
        );
        (application as any)._keyboardHeight = notification.userInfo.valueForKey(
            UIKeyboardFrameBeginUserInfoKey
        ).CGRectValue.size.height;
    }
);

Когда текстовое поле находится в фокусе, отрегулируйте вставки в виде списка

textFieldFocus() {
        console.log("Focus on TextField");
        (this
            .radList as any)._originalContentInset = this.radList.ios.contentInset;
        if ((application as any)._keyboardHeight) {
            this.radList.ios.contentInset = UIEdgeInsetsMake(
                (application as any)._keyboardHeight,
                0,
                0,
                0
            );
        } else {
            setTimeout(() => this.textFieldFocus(), 100);
        }
    }

Проблема 2:

Это связано с тем, что при обновлении текста макеты текстового представления сами по себе. Предотвращение этого может сохранить положение прокрутки нетронутым. Приведенное ниже переопределение проверяет, сфокусировано ли поле, и игнорирует вызовы макета.

import { TextView } from "@nativescript/core/ui/text-view";

TextView.prototype.requestLayout = function() {
    if (
        !arguments[0] &&
        this.nativeViewProtected &&
        this.nativeViewProtected.isFirstResponder
    ) {
        this.nativeViewProtected.setNeedsLayout();
        IQKeyboardManager.sharedManager().reloadLayoutIfNeeded();
    } else {
        View.prototype.requestLayout.call(this);
    }
};

Обновленная площадка

person Manoj    schedule 03.06.2020