Что такое Geometry Reader в SwiftUI? - PullRequest
9 голосов
/ 24 июня 2019

Я изучаю SwiftUI.И я сталкиваюсь с "GeometryReader".И я хочу знать, почему и когда его использовать?

Ответы [ 2 ]

16 голосов
/ 24 июня 2019

UPDATE

С тех пор, как я опубликовал ответ, я также написал статью о том, как работает GeometryReader. Проверьте это для более подробного объяснения: https://swiftui -lab.com / geometryreader-to-the-rescue /


GeometryReader - это представление, которое дает вам доступ к размеру и положению вашего родителя. Например:

struct MyView: View {
    var body: some View {
        GeometryReader { geometry in
           // Here goes your view content,
           // and you can use the geometry variable
           // which contains geometry.size of the parent
           // You also have function to get the bounds
           // of the parent: geometry.frame(in: .global)
        }
    }
}

Я обычно комбинирую его с .background (), чтобы получить границы некоторых других представлений. Например, представление «Текст» сложно предсказать, насколько большим оно будет заранее. Когда мне нужна эта информация, я использую этот трюк:

Сначала я определил представление с именем GeometryGetter:

struct GeometryGetter: View {
    @Binding var rect: CGRect

    var body: some View {
        return GeometryReader { geometry in
            self.makeView(geometry: geometry)
        }
    }

    func makeView(geometry: GeometryProxy) -> some View {
        DispatchQueue.main.async {
            self.rect = geometry.frame(in: .global)
        }

        return Rectangle().fill(Color.clear)
    }
}

Затем, чтобы получить границы текстового представления (или любого другого представления):

struct MyView: View {
    @State private var rect: CGRect = CGRect()

    var body: some View {
        Text("some text").background(GeometryGetter($rect))

        // You can then use rect in other places of your view:
        Rectangle().frame(width: 100, height: rect.height)
    }
}

Для некоторых случаев использования я разместил ответы на другие вопросы, которые используют GeometryReader. Проверьте их:

Перемещение текстовых полей, чтобы избежать их скрытия клавиатурой: https://stackoverflow.com/a/56721268/7786555

Как сделать размер представления другим в SwiftUI: https://stackoverflow.com/a/56661706/7786555

Примечание

В GeometryGetter я добавил DispatchQueue.main.async {} для установки прямоугольника. В некоторых случаях это может привести к предупреждению времени выполнения, в противном случае: Изменение состояния во время обновления представления .

0 голосов
/ 19 июля 2019

Ответ Kontiki действительно полезен, но также и слишком сложен для человека, который просто хочет иметь возможность использовать считыватель геометрии настолько просто, насколько это возможно.

Вы можете легко извлечь значение считывателя геометрии для своего представления и передать его в любое место в вашем коде с помощью:

struct ViewContainer: View {
var body: some View {
    GeometryReader { geometry -> YourView in
            extractedGeometryVariable = geometry.frame(in: .global)
            return YourView()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...