Разрешить / запретить изменение размера шрифта для специальных возможностей метки

Я реализую доступность размера шрифта в приложении NativeScript-Vue.
Я хочу разрешить или запретить изменение размера метки с помощью атрибута XML как для Android, так и для iOS, но поведение и реализация на платформах различаются.

Android
По умолчанию все ярлыки масштабируются. Если я хочу, чтобы размер метки не изменялся, мне нужно вызвать функцию setTextSize в событии loaded, следуя этому решению.

<Label text="Not resizable" @loaded="$androidFixedLabelSize($event, 70)" />
Vue.prototype.$androidFixedLabelSize = function({ object }, fontSize) {
    if (object.android)
    object.nativeView.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, utils.layout.toDevicePixels(fontSize));
}

iOS
По умолчанию ярлыки не масштабируются. Чтобы изменить размер метки, мне нужно использовать плагин nativescript-accessibility-ext и добавить атрибут accessibilityAdjustsFontSize.

<Label text="Resizable" accessibilityAdjustsFontSize="true" />

Необходимость добавления одного атрибута для фиксированного Android и одного для изменяемого размера iOS немного обременительна.

Я думал о том, чтобы изменить размер всех меток по умолчанию, и указать, хочу ли я, чтобы размер одного из них не изменялся, с помощью директивы или атрибута.
Могу ли я добиться этого с помощью настраиваемой директивы? Или что-то другое?


Обновлять

Мне удалось предотвратить изменение размера на Android с помощью директивы без жесткого кодирования размера шрифта, но есть проблема: update запускается только для нескольких меток. el.nativeView.android в bind и inserted хуках не определено.

Vue.directive("noresize", {
    update: el => {
        if (el.nativeView.android) {
            el.nativeView.android.setTextSize(android.util.TypedValue.COMPLEX_UNIT_DIP, el.nativeView.fontSize);
        } else {
            // iOS code
        }
    }
});

В iOS я хотел бы просто установить accessibilityAdjustsFontSize="false", но это означает, что это правда по умолчанию.

Итак, следующий вопрос: как установить accessibilityAdjustsFontSize="true" для всех компонентов Label в iOS?


person TomG    schedule 11.06.2019    source источник
comment
Конечно, вы можете сделать это с помощью настраиваемой директивы, я считаю, что это вся причина выбора таких фреймворков, как Vue или Angular, а не NativeScript Core. Но 120 меток на экране? Надеюсь, вы знаете о компоненте ListView, по возможности используйте его для длинного списка контента. Также, к вашему сведению, вы можете использовать блок пикселей, просто указав размер шрифта в пикселях в CSS (font-size: 15px).   -  person Manoj    schedule 11.06.2019
comment
Используя настраиваемую директиву, объект Label nativeView, к которому я обращаюсь в хуках, поставляется без setTextSize (кроме того, свойства android или ios отображаются неопределенными до update хука). ListView не подходит для моей страницы с ярлыками максимум 120 (худший сценарий). У меня нет задержек рендеринга с использованием простых меток. Наконец, установка размера шрифта через setTextSize - единственный способ избежать автоматического масштабирования, который я нашел.   -  person TomG    schedule 11.06.2019
comment
Возможно, у вас нет доступа к нему с правильными атрибутами. Можете ли вы поделиться образцом Playground для директивы? Между тем, у меня тоже есть поддержка автоматического масштабирования в моих приложениях, мне не нужно было ничего делать на Android, я не совсем уверен, почему вам нужно использовать px. Блок DIP (по умолчанию) все еще в порядке. Для iOS я взял логику плагина, но реализовал то же самое на уровне шрифта, поэтому он автоматически масштабируется для всех компонентов.   -  person Manoj    schedule 11.06.2019
comment
Я использую setTextSize с px на основе этого решения, которое является единственным решением, которое я нашел для предотвращения автоматического масштабирования. Я не изучал код глубоко. Внимательно изучив документацию по Android, Я вижу, можно использовать DIP   -  person TomG    schedule 11.06.2019
comment
Извините, вы пытаетесь избежать автоматического масштабирования или реализовать его? Поскольку в iOS это не обрабатывается по умолчанию, вы должны использовать плагин, если хотите поддерживать автоматическое масштабирование.   -  person Manoj    schedule 11.06.2019
comment
Я реализовал автоматическое масштабирование на iOS. Я хочу иметь возможность разрешать или игнорировать автоматическое масштабирование на моих этикетках с помощью простого атрибута как для Android, так и для iOS. В то время как на iOS это обрабатывается плагином (accessibilityAdjustsFontSize="true|false (default)"), на Android это не так, и обходной путь setTextSize - единственное решение, которое я нашел для предотвращения автоматического масштабирования.   -  person TomG    schedule 11.06.2019
comment
Как я уже упоминал, просто добавьте класс к этим меткам или установите для атрибута fontSize значение unit. Если у вас есть проблемы с вашей настраиваемой директивой, поделитесь образцом кода.   -  person Manoj    schedule 11.06.2019


Ответы (1)


Благодаря Мортену Шегрену, разработчику @ nota / nativescript-accessibility-ext, я был возможность добавить глобальное событие. Изменение размера для специальных возможностей теперь применяется ко всем компонентам Label, если атрибут noResize не имеет значения true.

app.js

import '@nota/nativescript-accessibility-ext';
import { Label } from 'tns-core-modules/ui/label';

// code

Label.on(Label.loadedEvent, ({ object }) => {
    if (object.noResize) {
        if (object.android) {
            object.nativeView.setTextSize(android.util.TypedValue.COMPLEX_UNIT_DIP, object.fontSize);
        }
    } else {
        object.accessibilityAdjustsFontSize = "true";
    }
 });

<Label text="Don't resize" noResize="true" />
person TomG    schedule 17.06.2019