SwiftUI: изменить размер текста, чтобы соответствовать кнопке - PullRequest
1 голос
/ 22 марта 2020

Я обновляю текст кнопки на основе значений в базе данных, и, поскольку эти значения могут быть очень длинными или очень короткими, я хочу, чтобы размер кнопки оставался постоянным, а размер текста изменялся динамически в зависимости от того, насколько велико значение, поэтому остается внутри кнопки и не усекается (значения будут предложения, это приложение для изучения языка). Я в основном хочу, чтобы размер шрифта был минимально возможным и максимально возможным значением.

Я знаю, как это сделать в Android Studio.

autoSizeMinTextSize=14sp
autoSizeMaxTestSize=20sp

Но когда я попытался использовать предложения, такие как большой размер шрифта с минимальным ScaleFactor, это не работает. Это просто делает текст невероятно маленьким.

Вот мой стиль кнопок.

struct SoundButton: ButtonStyle {

    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .foregroundColor(Color.black)
            .multilineTextAlignment(.center)
            .font(.custom("arial", size: 20))
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(configuration.isPressed ? LinearGradient(gradient: Gradient(colors: [Color("DarkestGreen"), Color("LightGreen")]), startPoint: .top, endPoint: .bottom):LinearGradient(gradient: Gradient(colors: [Color("DarkGreen"), Color("LightGreen")]), startPoint: .top, endPoint: .bottom))
            .cornerRadius(10)
            .shadow(radius: 3.0)
            .overlay(
                RoundedRectangle(cornerRadius: 10)
                    .stroke(Color.white, lineWidth:2))
            .padding(2)
            .scaleEffect(configuration.isPressed ? 0.975 : 1.0)
    }
}

А вот код кнопки.

                        Button(action: {
                            playSound(sound: "\(self.category)_audio1", type: "mp3")
                            self.translation = self.btns[1][1]
                        }) {
                            if(gotValues==true) {
                                Text("\(self.btns[1][0])")
                            } else {
                                Text("\(self.btn1)")
                            }
                        }

Вот то, что мой экран выглядит как в приложении.

enter image description here

Что можно добавить к этому, чтобы добиться желаемого эффекта? Спасибо.

Также, вот рабочая android версия.

enter image description here

1 Ответ

1 голос
/ 22 марта 2020

Насколько я понял вашу цель, следующее должно дать вам необходимый эффект (или что-то вроде) ...

Протестировано с Xcode 11.4 / iOS 13.4

demo

configuration.label
    .padding(.horizontal, 8).lineLimit(1).minimumScaleFactor(0.4) // << this place !
    .foregroundColor(Color.white)
...