SwiftUI:如何让 scaledToFit() 使用 HStack 均匀地应用缩放

Posted

技术标签:

【中文标题】SwiftUI:如何让 scaledToFit() 使用 HStack 均匀地应用缩放【英文标题】:SwiftUI: how to get scaledToFit() to apply scaling evenly with HStack 【发布时间】:2021-05-13 23:52:56 【问题描述】:

我有一个类似于 SwiftUI: minimumScaleFactor not applying evenly to stack elements 的问题,但在我的情况下,我什至无法使用 HStack 缩放元素。

我想要:

struct ScaleWithSymbol: View 
    var body: some View 
        HStack(spacing: 0) 
            Group 
                Text("XX°")
                Text("↑")
                    .scaleEffect(0.75)
            
        
        .lineLimit(1)
    


struct ScaleWithSymbol_Previews: PreviewProvider 
    static var previews: some View 
        ScaleWithSymbol()
            .frame(height: 8)
//            .frame(width: 18)
            .scaledToFit()
            .minimumScaleFactor(0.1)
    

如果我强制高度,事情会均匀缩放 (.frame(height: 8)) 并产生上面的屏幕截图。

但是如果我通过 .frame(width: 18) 来强制宽度——我的用例是我想将视图强制为给定宽度——我得到:

缩放到固定宽度但均匀的最佳方法是什么?谢谢。

【问题讨论】:

【参考方案1】:

奇怪的是,问题出在这一行:

.lineLimit(1)

删除之后,代码就可以工作了。这是一个带有Slider 的交互式示例:

struct ContentView: View 
    @State private var width: CGFloat = 50
    
    var body: some View 
        VStack 
            ScaleWithSymbol()
                .scaledToFit()
                .minimumScaleFactor(0.1)
                .frame(width: width)
            
            Slider(value: $width, in: 1 ... 60)
        
    

struct ScaleWithSymbol: View 
    var body: some View 
        HStack(spacing: 0) 
            Text("XX°")
            Text("↑").scaleEffect(0.75)
        
    

【讨论】:

谢谢 George_E,但没有解决我的核心问题。缩放比例仍然不均匀。至少在 Xcode 12.5 中,当宽度较小时,第二个 Text() 的缩放比例与第一个不同。我希望两个 Text() 之间的比例保持不变。 @t9mike 已修复,没有注意到 - 但事实证明问题只是 lineLimit(1) - 需要吗? 所以我的根本问题是我在 .scaledToFit() 之前有 .frame()。然后我添加了 .linelimit() 来解决这个问题(有点!)。乌格。非常感谢@George_E 的帮助和展开这个。

以上是关于SwiftUI:如何让 scaledToFit() 使用 HStack 均匀地应用缩放的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI中的GLKView?

如何使用 SwiftUI 实现已裁剪为形状的缓慢滑动图像?

SwiftUI 中图像按钮的可点击区域

SwiftUI Image scaledToFill 布局行为

SwiftUI GeometryReader 不会在中心布局自定义子视图

如何在 swift ui 中调整形状以适应文本视图的长度和宽度