Warm tip: This article is reproduced from stackoverflow.com, please click
swift swiftui

How to define variables inside a GeometryReader in SwiftUI

发布于 2020-06-12 16:07:42

I'd like to calculate the line width of a shape inside a view based on the view's size. Looking through various posts here on StackOverflow, I think the solution is to use a GeometryReader like this:

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)
        }
    }
}

My question is, how can I define variables inside the GeometryReader construct to be used for the view? I've tried to put a var statement directly after the line "GeometryReader { geometry in", but this gives a compiler error.

Questioner
G. Marc
Viewed
37
arsenius 2019-07-17 07:55

This seems to be a function builder related bug (as of Beta 3), and I recommend filing feedback on it.

The workaround I've been using is to use GeometryProxy in a separate method with an explicit return.


var body: some View {
  GeometryReader { proxy in
    self.useProxy(proxy)
  }
}

func useProxy(_ proxy: GeometryProxy) -> some View {
  var width = proxy.size.width
  return VStack {
    // use width in here
  }
}