SwiftUI Масштабирование шрифтов в сложном виде - PullRequest
1 голос
/ 20 октября 2019

Моя цель - сделать так, чтобы текст в контейнере масштабировался в соответствии с его родителем. Это работает хорошо, когда контейнер содержит только одно текстовое представление, как показано ниже:

import SwiftUI

struct FontScalingExperiment: View {
    var body: some View {
        Text("Hello World ~!")
            .font(.system(size: 500))
            .minimumScaleFactor(0.01)
            .lineLimit(1)
            .padding()
            .background(
                RoundedRectangle(cornerRadius: 20)
                    .fill(Color.yellow)
                    .scaledToFill()  
        )
    }
}

struct FontScalingExperiment_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            FontScalingExperiment()
                .previewLayout(.fixed(width: 100, height: 100))
            FontScalingExperiment()
                .previewLayout(.fixed(width: 200, height: 200))
            FontScalingExperiment()
                .previewLayout(.fixed(width: 300, height: 300))
            FontScalingExperiment()
                .previewLayout(.fixed(width: 400, height: 400))
        }

    }
}

результат:

Result

Однако, когда у нас более сложное представлениеМы не можем использовать тот же подход для автоматического масштабирования текста на основе его родительского размера, например:

import SwiftUI

struct IndicatorExperiment: View {
    var body: some View {
        VStack {
            HStack {
                Text("Line 1")
                Spacer()
            }
            Spacer()
            VStack {
                Text("Line 2")
                Text("Line 3")
            }
            Spacer()
            Text("Line 4")
        }
        .padding()
        .background(
            RoundedRectangle(cornerRadius: 20)
                .fill(Color.yellow)
        )
            .aspectRatio(1, contentMode: .fit)
    }
}

struct IndicatorExperiment_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            IndicatorExperiment()
                .previewLayout(.fixed(width: 100, height: 100))
            IndicatorExperiment()
                .previewLayout(.fixed(width: 200, height: 200))
            IndicatorExperiment()
                .previewLayout(.fixed(width: 300, height: 300))
            IndicatorExperiment()
                .previewLayout(.fixed(width: 400, height: 400))
        }
    }
}

Просто добавив эти 3 модификатора:

.font(.system(size: 500)) .minimumScaleFactor(0.01) .lineLimit(1)

не приведет к результату, как в первом примере;Текст увеличен за рамкой. Я сделал это успешно, получаю желаемый результат с помощью GeometryReader, затем масштабирую размер шрифта на основе geometry.size.width. Это единственный подход для достижения желаемого результата в SwiftUI?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...