如何在swiftUI的一侧拉伸图像,例如Android中的.9文件?

时间:2020-02-22 16:08:41

标签: swiftui

我有一张图片,我只想拉伸它的高度以适合不同的内容,我该如何在swiftUI中做到这一点?现在看起来像这样

enter image description here

struct ContentView: View {
var body: some View {
    VStack {
        HStack {
            VStack(alignment: .leading, spacing: 130) {
                Text("Title")
                    .font(.headline)
                    .foregroundColor(.primary)

                Text("text")
                    .font(.subheadline)
                    .foregroundColor(.secondary)

                Text("padding")
            }
            .padding(.vertical)

            Spacer()

            Image("rightTag")
                .resizable(capInsets: .init(top: 0, leading: 0, bottom: 0, trailing: 0), resizingMode: .stretch)
                .aspectRatio(contentMode: .fit)
                .frame(maxWidth: 20)
            }
            .frame(maxWidth: screen.width - 60)
            .padding(.leading)
            .background(.white)
            .cornerRadius(20)
        }
    }
}

我如何拉伸其高度以适合此外框?可调整大小,无法完成。 任何帮助都会很棒!谢谢! 对不起,我没有让自己更清楚。

1 个答案:

答案 0 :(得分:0)

这是可行的方法。但是,正如我现在看到的,您宁愿不拉伸整个原始图像,而只拉伸其中一个,所以在实际项目中,需要将图像分成三部分,并在拉伸方法以下仅应用于中间(正方形)部分。

方法使用异步状态更新,因此可以在实时预览/模拟器/ RealDevice中使用。 (已通过Xcode 11.2 / iOS 13.2测试)

struct ContentView: View {
    @State private var textHeigh: CGFloat = .zero
    var body: some View {
    VStack {
        HStack(alignment: .top) {
            VStack(alignment: .leading, spacing: 130) {
                Text("Title")
                    .font(.headline)
                    .foregroundColor(.primary)

                Text("text")
                    .font(.subheadline)
                    .foregroundColor(.secondary)

                Text("padding")
            }
            .padding(.vertical)
            .alignmentGuide(.top, computeValue: { d in
                DispatchQueue.main.async {
                    self.textHeigh = d.height // !! detectable height of left side text
                }
                return d[.top]
            })

            Spacer()

            Image("rightTag")
                .resizable()
                .frame(maxWidth: 20, maxHeight: max(60, textHeigh)) // 60 just for default
            }
            .frame(maxWidth: screen.width - 60)
            .padding(.leading)
            .background(Color.white)
        }
    }
}