如何在适合视图的同时使文本大小一致

Posted

技术标签:

【中文标题】如何在适合视图的同时使文本大小一致【英文标题】:How do I get the Text to be uniform size while fitting to the view 【发布时间】:2021-10-16 04:00:43 【问题描述】:

我正在 swiftui 中创建一个 TimerView,在按下按钮时获取开始时间和停止时间。

我在一个 HStack 中使用了两个 VStack 来确保文本正确对齐,但我无法考虑时间戳文本大小有时太大并且不对齐(时间戳低于标签!) (单击开始)或两个不同的时间戳具有不同的大小(单击停止)

我应该如何确保文本在适合窗口的同时大小一致(文本太长并且超出范围)?

import SwiftUI

struct TimerView: View 
    @State var fromTime = ""
    @State var toTime = ""
    
    var body: some View 
        VStack (alignment: .leading)
            HStack
                VStack (alignment: .leading)
                    Text("From Time: ").padding(.bottom, 3.0)
                    Text("To Time: ")
                
                
                VStack (alignment: .leading) 
                    Text(fromTime).minimumScaleFactor(0.2).padding(.bottom, 3.0)
                    Text(toTime).minimumScaleFactor(0.2)
                
                //Text(fromTime).minimumScaleFactor(0.2)
            .padding(.bottom, 60.0)
            //            HStack
            //                Text("To Time: ")
            //                Text(toTime).minimumScaleFactor(0.2)
            //            .padding(.bottom, 60.0)
            HStack
                Button(action: fromTime = getDate()) 
                    Text("Start")
                .padding(.top, 10.0)
                .padding(.bottom, 10.0)
                .padding(.trailing,40.0)
                .padding(.leading, 40.0)
                .overlay(
                    RoundedRectangle(cornerRadius: 10.0).stroke(lineWidth: 2.0)
                )
                
                Button(action: toTime = getDate()) 
                    Text("Stop")
                .padding(.top, 10.0)
                .padding(.bottom, 10.0)
                .padding(.trailing, 40.0)
                .padding(.leading, 40.0)
                .overlay(
                    RoundedRectangle(cornerRadius: 10.0)
                        .stroke(lineWidth: 2.0)
                )
            
        
    


struct TimerView_Previews: PreviewProvider 
    static var previews: some View 
        TimerView()
    


extension TimerView 
    func getDate()->String
        let time = Date()
        let timeFormatter = DateFormatter()
        timeFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let stringDate = timeFormatter.string(from: time)
        return stringDate
    

【问题讨论】:

【参考方案1】:

添加第一个TextBaseline

struct TimerView: View 
    @State var fromTime = ""
    @State var toTime = ""
    
    var body: some View 
        VStack (alignment: .leading)
           HStack(alignment: .firstTextBaseline) // <----- Add this line
                VStack (alignment: .leading)
                    Text("From Time: ").padding(.bottom, 3.0)
                    Text("To Time: ")
                
                
                VStack (alignment: .leading) 
                    Text(fromTime).minimumScaleFactor(0.2).padding(.bottom, 3.0)
                    Text(toTime).minimumScaleFactor(0.2)
                
                //Text(fromTime).minimumScaleFactor(0.2)
            .padding(.bottom, 60.0)
            //            HStack
            //                Text("To Time: ")
            //                Text(toTime).minimumScaleFactor(0.2)
            //            .padding(.bottom, 60.0)
            HStack
                Button(action: fromTime = getDate()) 
                    Text("Start")
                .padding(.top, 10.0)
                .padding(.bottom, 10.0)
                .padding(.trailing,40.0)
                .padding(.leading, 40.0)
                .overlay(
                    RoundedRectangle(cornerRadius: 10.0).stroke(lineWidth: 2.0)
                )
                
                Button(action: toTime = getDate()) 
                    Text("Stop")
                .padding(.top, 10.0)
                .padding(.bottom, 10.0)
                .padding(.trailing, 40.0)
                .padding(.leading, 40.0)
                .overlay(
                    RoundedRectangle(cornerRadius: 10.0)
                        .stroke(lineWidth: 2.0)
                )
            
        
    

【讨论】:

嗨@Ray Xu,虽然您的回答帮助我解决了文本的对齐问题,但缩放文本时的文本格式并没有解决,所以我选择删除文本缩放并使用以下内容:@ 987654321@ 尽管您的回答最接近解决我的问题,同时保留了我尝试使用的外观。谢谢你的回答!【参考方案2】:

你可以简单地根据屏幕大小调整字体大小, 例如:一种小字体用于小型设备,另一种用于大型设备。 看到这个How to get device width and height?

然后使用它,给定所需的字体fsize

HStack 
    VStack (alignment: .leading) 
        Text("From Time: " + fromTime)
        Text("To Time:   " + toTime)
    
    .font(.system(size: fsize))  // <--- here to fit the screen width
    .padding(.bottom, 3.0)
.padding(.bottom, 60.0)

【讨论】:

嗨@workingdog,虽然您的解决方案附加到文本要简单得多,但它没有提供我在模拟器中想要的用户界面的“外观”,这就是我选择另一个的原因回答。谢谢你的回答!

以上是关于如何在适合视图的同时使文本大小一致的主要内容,如果未能解决你的问题,请参考以下文章

动态调整文本大小以使整个文本行适合文本字段

如何使用 VBA 在 Word 中将多个图像裁剪为相同大小,同时使其适合其容器形状

如何在 React Native for Android 中调整字体大小以适应视图?

如何使标签文本轮廓化并适合标签的大小

如何使用自动布局调整视图大小以适合标签子视图?

如何使 UITableView 适合内容的大小