Как использовать GeometryReader без его заполнения View - PullRequest
1 голос
/ 14 февраля 2020

Это макет, к которому я стремлюсь.

import SwiftUI
import PlaygroundSupport

struct TestView: View {

    let text: String

    var body: some View {
        Text(self.text)
    }
}

struct ContentView: View {
    var body: some View {
        ZStack {
            TestView(text: "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla")
                .frame(width: 250)
                .background(Color.red)
        }
    }
}

PlaygroundPage.current.setLiveView(ContentView())

enter image description here

Но я также хочу использовать GeometryReader и когда я поместите Text внутрь GeometryReader, он займет всю высоту.

import SwiftUI
import PlaygroundSupport

struct TestView: View {

    let text: String

    var body: some View {
        GeometryReader { reader in
            Text(self.text)
        }
    }
}

struct ContentView: View {
    var body: some View {
        ZStack {
            TestView(text: "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla")
                .frame(width: 250)
                .background(Color.red)
        }
    }
}

PlaygroundPage.current.setLiveView(ContentView())

enter image description here

Как мне обойти это?

1 Ответ

0 голосов
/ 14 февраля 2020

ПРЕДУПРЕЖДЕНИЕ ⚠️: Это когда читатель Geomtery не смог мне помочь с геометрией, и я начал биться головой о стену

Вот что вы можете сделать:

struct ContentView: View {

    var text =  "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla"
    var width : CGFloat = 250

    var height: CGFloat {
        var size : CGFloat
        let chars = self.width / 14  // assuming width of 1 character is 14 which is the case by default for Text view
        let lines = CGFloat(text.count) / chars
        size = CGFloat(14 * (lines + 1))
        return size
    }

    var body: some View {
        ZStack {
            TestView(text: text)
            .frame(width: width, height: height)
            .background(Color.red)
        }
    }
}

Установите высоту TestView вручную, используя высоту в качестве вычисляемого свойства.

screenshot

История вопроса о том, как я оценил значение по умолчанию высота шрифта

Нажмите shift + команда + 4 Используйте указатель и найдите разницу между относительными позициями y

...