SwiftUI - 文本 minimumScaleFactor 仅在需要时不缩放

SwiftUI - Text minimumScaleFactor not scaling only when needed

我有一个文本,当它的字符串长度超出视图时,我想用 .minimumScaleFactor(0.1) 修改它。但是,每次都会应用缩放,即使原始字体大小非常合适。

我的观点是这样构成的:

        VStack(alignment: .center, spacing: 0) {
            HStack {
                Image("medal \(place)").resizable()
                    .foregroundColor(color)
                    .frame(width: 40, height: 40)
                Spacer()
                Text(username)
                    .font(.bold(16))
                    .lineLimit(1)
                    .minimumScaleFactor(0.1)
                    .frame(alignment: .trailing)
                    .foregroundColor(Color("mediumTextColor"))
            }
            Spacer()
            Text(score)
                .font(.extraBold(60))
                .foregroundColor(color)
                .lineLimit(1)
                .minimumScaleFactor(0.7)

            Spacer()
        }
        .frame(height: 96)
        .padding(10)
        .cornerRadius(16)
        .overlay(RoundedRectangle(cornerRadius: 16)
        .stroke(color, lineWidth: 2))

在您的文本中添加 .layoutPriority(1) 修饰符以确保它采用 space(如果有的话)。

在我的两个文本视图所在的 VStack 周围添加一个 GeometryReader 解决了这个问题。根据@gohnjanotis 的要求:

GeometryReader { proxy in
    VStack(alignment: .center, spacing: 0) {
        HStack {
            Image("medal \(self.place)").resizable()
                .foregroundColor(self.color)
                .frame(width: 40, height: 40)

            Spacer()
            Text(self.username)
                .minimumScaleFactor(0.1)
                .font(.bold(16))
                .lineLimit(1)
                .frame(alignment: .trailing)
                .foregroundColor(Color("mediumTextColor"))
                .layoutPriority(1)

        }
        .padding(.top, 10)
        .padding(.horizontal, 10)
        Spacer()
        Text(self.score)
            .font(.extraBold(60))
            .foregroundColor(self.color)
            .lineLimit(1)
            .minimumScaleFactor(0.1)
            .layoutPriority(1)
            .padding(.horizontal, 10)
            .padding(.bottom, 10)
            .offset(y: -10)
    }
    .frame(width: proxy.size.width, height: proxy.size.height, alignment: .top)
}
.frame(maxHeight: 130)

在文本中添加 .lineLimit(1) 效果很好。

Xcode: 11.3.1

上述回答的延续。

重要的是修饰符的应用顺序:

Text("This is a really long sentence.") 
   .minimumScaleFactor(0.5)                
   .font(.custom("OpenSans", size: 15))
   .lineLimit(1)
   .layoutPriority(1)

不需要 GeometryReader,除非您需要它来做其他事情

重要的是 minimumScaleFactor() 只在需要时才起作用,是 .minimumScaleFactor.lineLimit(1) 的组合;否则它不会工作。 layoutPriority(1) 不是这里的关键。

示例 - 这行得通;仅在需要时应用比例:

Text("Something").minimumScaleFactor(0.5).lineLimit(1)

在尝试了很长时间解决这个问题之后...使用 minimumScaleFactor、LineLimit、layoutPriority...我发现使用 .frame() 有助于解决我的问题。

我的问题是 minimumScaleFactor 即使不需要也适用于文本。

在最后一行应用 .frame() 解决了我的问题。

像这样...

GeometryReader { geometry in
    VStack{
        
        Text("Hello")
            .foregroundColor(Color.Black)
            .font(.system(size: 50))
            .minimumScaleFactor(0.1)
            .lineLimit(1)
            .frame(height: geometry.size.height)
    }
}