как растянуть изображение с одной стороны в swiftUI, как файл .9 в Android? - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть изображение, которое я хочу растянуть, только его высота, чтобы соответствовать разному контенту, как мне это сделать в 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 голосов
/ 22 февраля 2020

Здесь возможен подход. Однако, как я теперь вижу, вам лучше растянуть не все исходное изображение, а только его середину, поэтому в реальном проекте потребуется сделать изображение трехкомпонентным и применить метод растяжения ниже только к середине (квадрату). part.

Подход использует асинхронное обновление состояния, поэтому работает в Live Preview / Simulator / 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)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...