SwiftUI:调整文本大小以适应按钮

4
我根据数据库中的值更新按钮文本,由于这些值可能非常长或非常短,我希望按钮大小保持不变,并且文本根据值的大小动态调整大小,以便它始终在按钮内并且不被截断(这些值将是句子,这是一款语言学习应用程序)。基本上,我想给字体大小一个最小可能值和一个最大可能值。
我知道如何在Android Studio中实现此操作。
autoSizeMinTextSize=14sp
autoSizeMaxTestSize=20sp

但是,当我尝试使用建议,例如使用minimumScaleFactor的大字体大小时,它并没有起作用。它只会使文本变得非常小。

这是我的按钮样式。

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
但是您不会限制按钮大小吗?.frame(maxWidth: .infinity, maxHeight: .infinity) 允许无限增长。那么呢? - Asperi
我有16个按钮。我希望它们在它们的父视图中平均分配屏幕空间。它们互相约束。 - Rob Paterson
1个回答

5
据我所理解,以下内容可以实现您的目标(或类似目标)......该内容已在Xcode 11.4 / iOS 13.4上进行了测试。如下图所示:demo
configuration.label
    .padding(.horizontal, 8).lineLimit(1).minimumScaleFactor(0.4) // << this place !
    .foregroundColor(Color.white)

我尝试过了,但是这些行非常小,无法填满按钮。每个按钮的字体大小也都相同。我已经在原帖中添加了一个工作正常的安卓版本的截图。 - Rob Paterson
如果您需要换行文本(这不是显而易见的),只需在提供的答案中删除.lineLimit修饰符即可。 - Asperi
如果我移除行限制并将比例因子改为0.8,它看起来更像Android版本,但仍然无法改变按钮上文本的大小。所有按钮都具有相同的字体大小。minimumScaleFactor似乎只是意味着比例因子。如果我将字体大小更改为16,则看起来完全相同。但在您的屏幕截图中,字体大小正在改变。也许我做错了什么。 - Rob Paterson
SwiftUI目前没有autoSizeMinTextSize这样的东西,如果需要的话,您可以向苹果提交反馈建议。至于minimumScaleFactor,根据文档中的描述,它是“最小允许比例,用于缩小字体大小以适应可用空间”,因此它不是一种“常规比例”,它会改变字体大小。 - Asperi
是的,问题就在于它在不必要的情况下缩小了字体大小。但你的代码允许字体大小不同。你在 configuration.label 中还有什么其他设置吗? - Rob Paterson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接