SwiftUI:如何限制图片大小?

时间:2020-09-14 03:56:27

标签: swiftui

我正在尝试将图片大小限制在最小值和最大值之间。但是视图会将宽度和高度都扩展到最大值,从而删除了原始的宽高比。

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()
    }
}

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

Bounding boxes around image and frame

使用GeometryReader进行了尝试,但这产生了将黄色框扩展为红色框的相反效果。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

enter image description here

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)
    }
}