Текст SwiftUI с минимальным коэффициентом всегда уменьшает текст

#ios #swift #swiftui #ios14

#iOS #swift #swiftui #ios14

Вопрос:

Я столкнулся с проблемой с некоторым SwiftUI для кода виджета. Я хочу создать текстовый компонент, который уменьшает текст, но ТОЛЬКО в том случае, если текст, который он содержит, не поместится. Однако я вижу, что он постоянно уменьшает масштаб текста. Кто-нибудь знает, что я делаю не так?

  Text(verbatim: entry.records[0].value)
        .foregroundColor(.white)
        .font(Font.custom("SFCompactDisplay-Thin", size: 48))
        .minimumScaleFactor(0.75)
        .frame(minWidth: 100, idealWidth: 200, maxWidth: .infinity, minHeight: 48, idealHeight: 48, maxHeight: 48, alignment: .leading)
        .padding(.top, 0)
        .padding(.bottom, 12)
        .padding(.leading, 10)
  

Комментарии:

1. Пожалуйста, будьте более конкретны: какой текст, в каком макете, контексте и т.д.?

2. Извините, я должен был быть яснее. Это для виджета iOS 14

Ответ №1:

Ваш эффект обусловлен данным .frame ограничением. Если вы не хотите, чтобы текст масштабировался, не ограничивайте для него рамку, например

 Text(verbatim: "World")
        .foregroundColor(.white)
        .font(Font.custom("SFCompactDisplay-Thin", size: 48))
        .minimumScaleFactor(0.75)
        .frame(maxWidth: .infinity, alignment: .leading)     // << here !!
  

Примечание: 48 размер шрифта не эквивалентен 48 точкам на экране.

Ответ №2:

Похоже, что после запуска вашего кода работа идет нормально. (Рисунок 1, рисунок 2)

Если у вас все еще есть вопросы, удалите maxWidth: .infinity, и посмотрите. (Рисунок 3) Рисунок 1
Рисунок 2
Рисунок 3

Пожалуйста, дайте мне знать, каков конечный результат. Это мой тестовый код.

 struct ContentView: View {
    var body: some View {
        Text(verbatim: "Hello world Hello world Hello world Hello world Hello world")
        .foregroundColor(.black)
        .font(Font.custom("SFCompactDisplay-Thin", size: 48))
        .minimumScaleFactor(0.5)
        .frame(minWidth: 100, idealWidth: 200, minHeight: 48, idealHeight: 48, maxHeight: 48, alignment: .leading)
        .padding(.top, 0)
        .padding(.bottom, 12)
        .padding(.leading, 10)
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
  

обновление # 1

Рисунок 4 Вы можете обратиться к этому коду для решения проблем с выравниванием. Используйте HStack для макета.

     HStack {
        Text(verbatim: "Hello")
        .foregroundColor(.black)
        .font(Font.custom("SFCompactDisplay-Thin", size: 48))
        .minimumScaleFactor(0.1)
        .frame(minWidth: 10, idealWidth: 120, maxWidth: 120, minHeight: 48, idealHeight: 48, maxHeight: 48, alignment: .leading)
        .padding(.top, 0)
        .padding(.bottom, 12)
        .padding(.leading, 10)
        Spacer()
    }
  

Комментарии:

1. Итак, я попытался удалить maxwidth: .infinity, и все равно размер текста по умолчанию меньше 48. Кроме того, удаление maxwidth привело к тому, что текст не был выровнен по левому краю на 100%.

2. Можете ли вы предоставить более подробную информацию о макете? Или вы можете сосредоточиться на проверке ideaWidth и maxWidth себя.