SwiftUI:如何限制图像大小?

Posted

技术标签:

【中文标题】SwiftUI:如何限制图像大小?【英文标题】:SwiftUI: How to constrain image size? 【发布时间】:2020-09-14 03:56:27 【问题描述】:

我正在尝试将图像大小限制在最小和最大之间。但是视图将宽度和高度都扩展为最大值,移除了原来的纵横比。

import SwiftUI

struct ImageConstrainSizeTest: View 
    var body: some View 
        Image("bike")
            .resizable()
            .aspectRatio(contentMode: .fit)
            .border(Color.yellow, width: 5)
            .frame(minWidth: 10, maxWidth: 300, minHeight: 10, maxHeight: 300, alignment: .center)
            .border(Color.red, width: 5)
    


struct ImageConstrainSizeTest_Previews: PreviewProvider 
    static var previews: some View 
        ImageConstrainSizeTest()
    

在下面的截图中,我希望红色框缩小为黄色框。

尝试使用 GeometryReader,但这会产生将黄色框扩展到红色框的相反效果。

有什么想法吗?

【问题讨论】:

【参考方案1】:

这是一个可能的方法的演示 - 使用视图首选项和稍微不同的布局顺序(我们给区域以适应图像的纵横比,然后通过生成的图像大小限制该区域)。

使用 Xcode 11.7 / ios 13.7 准备和测试的演示

struct ViewSizeKey: PreferenceKey 
    typealias Value = CGSize
    static var defaultValue: CGSize = .zero
    static func reduce(value: inout Value, nextValue: () -> Value) 
        value = nextValue()
    


struct ImageConstrainSizeTest: View 
    @State private var size = CGSize.zero
    var body: some View 
        Color.clear
            .frame(width: 300, height: 300)
            .overlay(
                Image("img")
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .border(Color.yellow, width: 5)
                    .background(GeometryReader 
                        Color.clear.preference(key: ViewSizeKey.self,
                            value: $0.size) )
            )
            .onPreferenceChange(ViewSizeKey.self) 
                self.size = $0
            
            .frame(maxWidth: size.width, maxHeight: size.height)
            .border(Color.red, width: 5)
    

【讨论】:

谢谢!这很好用。我确实将内部 .background() 更改为 .overlay(),因为 .background 无法在图像上使用 .eraseToAnyView() 修饰符。

以上是关于SwiftUI:如何限制图像大小?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 视图,如 UIKit UIView,如何更改图像的大小

SwiftUI:如何找到图像的高度并使用它来设置框架的大小

SwiftUI:动态设置图像的大小

如何在图像前面制作一个按钮,但限制在 SwiftUI 中视图的左下角和右下角?

如何在 SwiftUI 中基于 SF Symbols 获得相同大小的圆形图像?

如何向 swiftUI ScrollView 指示内容大小已更改?