Как динамически и автоматически установить FontSize на основе view.Width? - PullRequest
0 голосов
/ 23 марта 2019

«ПРОВЕРКА АВТОМАТИЧЕСКОГО РАЗМЕРА» img_1 Размер шрифта слишком велик, поэтому часть строки обрезается (когда текст слишком большой, часть обрезается и заменяется многоточием).

"тестовый текст" img_2 Слишком маленький размер шрифта.FontSize - это треть его соответствующего вида (оценка).

Как установить fontSize элемента равным размеру ширины элемента (или содержащего представления)?Используйте приведенные выше примеры в качестве ссылки - «тестовый текст» будет занимать гораздо больше вида, а «ИСПОЛЬЗОВАНИЕ АВТОМАТИЧЕСКОГО РАЗМЕРА» займет гораздо меньше.

ПРИМЕЧАНИЕ. Черные поля обозначают другие элементы.

Желаемой целью является элемент (метка и / или содержащий вид), который при изменении текста во время выполнения устанавливается в fontSize в соответствии с назначенным текстом и доступной для него шириной (он остается постоянным после сборки).Чтобы весь текст можно было просмотреть в строке и использовать доступную для него ширину.

Цель состоит в том, чтобы поддерживать несколько платформ на различных устройствах с разным масштабированием.

Что было опробовано?NamedSizes на основе идиомы (телефон / планшет / и т. Д.) И манипулирования ими с помощью умножения и деления на основе ОС (платформы, то есть IOS, Android и т. Д.).Это не может быть лучшей практикой, и должен быть способ добиться этого.

Следуя руководству Xamarin.Forms по «подгонке текста к доступному размеру» или «эмпирически подгонке текста», вы получите результаты, которые не так хороши.ожидается .. "CH5: Работа с размерами"

Пожалуйста, сообщите о передовой практике и / или следующих шагах.

Структура

struct FontCalc
{
    public FontCalc(Label label, double fontSize, double containerWidth)
        : this()
    {
        // Save the font size.
        FontSize = fontSize;

        // Recalculate the Label height.
        label.FontSize = fontSize;
        SizeRequest sizeRequest =
            label.Measure(containerWidth, Double.PositiveInfinity);

        // Save that height.
        TextHeight = sizeRequest.Request.Height;
    }

    public double FontSize { private set; get; }

    public double TextHeight { private set; get; }
}

Реализация

Метка метки;

public EmpiricalFontSizePage()
{
    label = new Label();

    Padding = new Thickness(0, Device.RuntimePlatform == Device.iOS ? 30 : 0, 0, 0);
    ContentView contentView = new ContentView
    {
        Content = label
    };
    contentView.SizeChanged += OnContentViewSizeChanged;
    Content = contentView;
}

void OnContentViewSizeChanged(object sender, EventArgs args)
{
    // Get View whose size is changing.
    View view = (View)sender;

    if (view.Width <= 0 || view.Height <= 0)
        return;

    label.Text =
        "This is text displayed. Does it work?";

    // Calculate the height of the rendered text.
    FontCalc lowerFontCalc = new FontCalc(label, 10, view.Width);
    FontCalc upperFontCalc = new FontCalc(label, 100, view.Width);

    while (upperFontCalc.FontSize - lowerFontCalc.FontSize > 1)
    {
        // Get the average font size of the upper and lower bounds.
        double fontSize = (lowerFontCalc.FontSize + upperFontCalc.FontSize) / 2;

        // Check the new text height against the container height.
        FontCalc newFontCalc = new FontCalc(label, fontSize, view.Width);

        if (newFontCalc.TextHeight > view.Height)
        {
            upperFontCalc = newFontCalc;
        }
        else
        {
            lowerFontCalc = newFontCalc;
        }
    }

    // Set the final font size and the text with the embedded value.
    label.FontSize = lowerFontCalc.FontSize;
    label.Text = label.Text.Replace("??", label.FontSize.ToString("F0"));
}

(код реализации из документов XF, указанных выше)

1 Ответ

1 голос
/ 01 апреля 2019

Одним из решений является использование пакета NuGet: Forms9Patch

Используя его свойства Lines и AutoFit, мы можем достичь желаемого результата. В нашем случае нам нужна одна строка, и мы хотим, чтобы наш FontSize был установлен на то, что требуется, чтобы наш текст помещался в одну строку. Lines = 1, AutoFit = Forms9Patch.AutoFit.Width и FontSize установлены на большое значение (не имеет значения, если оно значительно превышает желаемый максимум, так как установка AutoFit в Width сокращает шрифт до того, что требуется, чтобы текст помещался в пределах указанное нами количество строк) приводит к Label, который автоматически подстраивает FontSize к максимальному пространству, доступному для него с учетом длины текста.

...