使用“ Vstack”将图像调整为屏幕宽度,同时保持宽高比

时间:2019-09-12 16:57:45

标签: swift swiftui vstack

我正在与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)一起使用的比例

还有其他方法可以正确显示图像,任何建议

image

1 个答案:

答案 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

结果:

playground result