在 Swiftui 的 Text() 中自动调整字体大小?

Posted

技术标签:

【中文标题】在 Swiftui 的 Text() 中自动调整字体大小?【英文标题】:Automatic adjust font size in Text() of Swiftui? 【发布时间】:2021-01-24 09:31:30 【问题描述】:

是否可以根据要显示的文本长度自动调整字体大小?例如,通过设置帧大小。是否可以自动缩小字体大小,使显示字体的宽度保持不变?

var body: some View 
    
    VStack 
        ZStack 
            GeometryReader  g in
                ZStack 
                    
                    ScrollView(.vertical, showsIndicators: true, content: 
                    VStack 
                        ZStack 
                            VStack 
                                Image("cat")
                                    .resizable()
                                    .aspectRatio(contentMode: .fill)
                                    .frame(width:g.size.width, height:g.size.height/4*3)
                                    .clipped(antialiased:true)
                                    .shadow(radius:25, x:0, y:0)
                                
                                VStack ()
                                    HStack 
                                        VStack (alignment: .leading) 
                                            HStack 
                                                Text("XXXX").font(.title)
                                               
                                                        .font(.system(size:35)).foregroundColor(.black).shadow(radius: 5)
                                                )
                                                Spacer()
                                                

                                            
                                            HStack 
                                                Text("xxxxxxxxxxxxx xxxxxxxxxxx xxxxxxxxxx ").font(.title2) // very long text here
                                                Spacer()
                                            
                                        
                                    
                                    
                                
                                .padding()
                                .frame(width:g.size.width, height:g.size.height/4*1, alignment: .top)
                            
                        .frame(width: g.size.width, height: g.size.height, alignment: .top)
                        

            
            .edgesIgnoringSafeArea(.all)
        
    

正如在我的代码中看到的,那里有一个很长的文本。文字在大部分设备上都可以完美显示,除了iPod Touch会因为太长而导致后面出现“xxxxxxxx xxxxxxxx xxxx ...”,“...”。无论如何它是否会自动跳转到下一行,或者缩小字体以便后面不会有“...”?

【问题讨论】:

【参考方案1】:

使用minimumScaleFactor(_:)https://developer.apple.com/documentation/swiftui/text/minimumscalefactor(_:)

struct ContentView: View 
    var body: some View 
        VStack
            Text("Test string")
                .minimumScaleFactor(0.1) //<--Here
                .frame(width: 15, height: 15)
        
    

【讨论】:

我已包含我的代码并再次澄清我的问题。 @user6539552 是的,在字体之后使用这个 .minimumScaleFactor(0.1)。它会自动使它变成两行并更改字体大小。如果你给出高度,那么它将根据帧自动调整。我检查了你的代码,它被这个修复了。 我可以知道为什么我们选择因子为 0.1 吗? 这是一个最终缩小字体大小的最小比例。您可以根据自己的要求进行设置。我选择了非常小的帧大小作为示例。 我可以强制它变成多行而不是缩小文本吗?

以上是关于在 Swiftui 的 Text() 中自动调整字体大小?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI ViewModifier - 添加字距调整

是否可以在 SwiftUI 中为 TextField 添加字距调整?

如何在 SwiftUI 中调整 navigationBarTitle 和 Label Text 对齐方式

SwiftUI Text.minimumScaleFactor(…)无法正确缩放文本?

在 SwiftUI 中根据文本高度自动调整视图高度

SwiftUI 自动调整底页大小