我正在与VStack
一起显示图片(它们将与json大小不同,但有几张)
我需要显示它以占据屏幕宽度(vstack的宽度并保持宽高比)并适当调整大小,同时注意根据屏幕宽度的高度。 我尝试了不同的方法,但是我设法正确显示了图像。
我的看法是:
struct ContentView: View {
var body: some View {
VStack {
GeometryReader { geometry in
VStack {
Text("Width: \(geometry.size.width)")
Text("Height: \(geometry.size.height)")
}
.foregroundColor(.white)
}
.padding()
.frame(alignment: .topLeading)
.foregroundColor(Color.white) .background(RoundedRectangle(cornerRadius: 10) .foregroundColor(.blue))
.padding()
GeometryReader { geometry in
VStack {
Image("sample")
.resizable()
//.frame(width: geometry.size.width)
.aspectRatio(contentMode: .fit)
}
.foregroundColor(.white)
}
.frame(alignment: .topLeading)
.foregroundColor(Color.white) .background(RoundedRectangle(cornerRadius: 10) .foregroundColor(.blue))
.padding()
}
.font(.title)
}
}
当我通过分配.frame (width: geometry.size.width)
的宽度来使用geometry
时,该宽度会显示在整个屏幕上,但是高度不能保持纵横比。 (看起来很沮丧)
如何获取图像的尺寸并找到与.aspectRatio (myratio, contentMode: .fit)
一起使用的比例
还有其他方法可以正确显示图像,任何建议
答案 0 :(得分:3)
您需要消除第二个GeometryReader
,因为VStack
中有两个孩子,两个孩子都接受提供的空间,这将使VStack
无法给Image
正确的空间量。
您还需要提高Image
的布局优先级,以便VStack
首先为其提供空间,以便可以占用所需的空间。
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
GeometryReader { geometry in
VStack {
Text("Width: \(geometry.size.width)")
Text("Height: \(geometry.size.height)")
}.foregroundColor(.white)
}.padding()
.background(
RoundedRectangle(cornerRadius: 10)
.foregroundColor(.blue))
.padding()
Image(uiImage: UIImage(named: "sample")!)
.resizable()
.aspectRatio(contentMode: .fit)
.layoutPriority(1)
}
}
}
import PlaygroundSupport
let host = UIHostingController(rootView: ContentView())
host.preferredContentSize = .init(width: 414, height: 896)
PlaygroundPage.current.liveView = host
结果: