SwiftUI Text.minimumScaleFactor (...) неправильно масштабирует текст? - PullRequest
0 голосов
/ 01 мая 2020

В SwiftUI я пытаюсь использовать minimumScaleFactor для автоматической адаптации размера Text. Похоже, у него странное поведение. Например, он работает с обычными символами, но не с акцентированными символами. Я ищу решение без произвольного соотношения, и оно работает со всеми шрифтами.

Вот упрощенный пример, показывающий фактическое поведение в сравнении с ожидаемым поведением.

Что я делаю неправильно?

import SwiftUI

struct TestScaleView: View {
    let text: String
    var body: some View {
        GeometryReader { geo in
            Text(self.text)
                .font(.system(size: 1000))
                .minimumScaleFactor(.leastNonzeroMagnitude)
                .lineLimit(1)
                .frame(width: geo.size.width, height: geo.size.height)
        }
    }
}

struct TestNoScaleView: View {
    let text: String
    var fontSize: CGFloat
    var body: some View {
        GeometryReader { geo in
            Text(self.text)
                .font(.system(size: self.fontSize))
                .lineLimit(1)
                .frame(width: geo.size.width, height: geo.size.height)
        }
    }
}

struct TestView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            // WHAT HAPPENS
            TestScaleView(text: "This shall scale perfectly!")
                .previewLayout(.fixed(width: 500, height: 70))
                .previewDisplayName("This is acceptable but not perfect")
            TestScaleView(text: "This shall scale perfectly with special characters like é or @!")
                .previewLayout(.fixed(width: 500, height: 70))
                .previewDisplayName("Ouch.")
            TestScaleView(text: "Small")
                .previewLayout(.fixed(width: 500, height: 70))
                .previewDisplayName("Not working well, right?")

            // WHAT IS EXPECTED
            TestNoScaleView(text: "This shall scale perfectly!", fontSize: 46)
                .previewLayout(.fixed(width: 500, height: 70))
                .previewDisplayName("Adjusted manually")
            TestNoScaleView(text: "This shall scale perfectly with special characters like é or @!",
                            fontSize: 18)
                .previewLayout(.fixed(width: 500, height: 70))
                .previewDisplayName("Adjusted manually")
            TestNoScaleView(text: "Small",
                            fontSize: 94)
                .previewLayout(.fixed(width: 500, height: 70))
                .previewDisplayName("Adjusted manually")
        }
    }
}

SwiftUI preview

1 Ответ

0 голосов
/ 01 мая 2020

Я следовал этому порядку

  • lineLimit
  • шрифт
  • minimalScaleFactor

, кажется, работает хорошо.

VStack {
    Text("This shall scale perfectly!")
        .lineLimit(1)
        .font(.system(size: 100))
        .minimumScaleFactor(.leastNonzeroMagnitude)

    Divider()
    Text("This may okay to be truncated from the middle, I am adding more text!!")
        .truncationMode(.middle)
        .lineLimit(1)
        .font(.system(size: 40))
        .minimumScaleFactor(0.5)

    Divider()
    Text("This shall scale perfectly with special characters like é or @!")
        .lineLimit(1)
        .font(.system(size: 38))
        .minimumScaleFactor(.leastNonzeroMagnitude)

    Divider()
    Text("Small")
        .lineLimit(1)
        .font(.system(size: 60))
        .minimumScaleFactor(0.1)           
}

Результат

Кстати, если вы хотите принудительно разбить это масштабирование с размером шрифта, например 1000, вы, вероятно, можете достигнуть:)

...