我正在尝试将图片大小限制在最小值和最大值之间。但是视图会将宽度和高度都扩展到最大值,从而删除了原始的宽高比。
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进行了尝试,但这产生了将黄色框扩展为红色框的相反效果。
有什么想法吗?
答案 0 :(得分: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)
}
}