Как установить высоту и ширину пропорционально суперпредставлению в SwiftUI? - PullRequest
0 голосов
/ 08 октября 2019

Я хочу знать, что можно настроить height и width пропорционально в соответствии с суперпредставлением в SwiftUI для любого UIControl?

Как мы делаем:

let txtFld = UITextField()
txtFld.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: self.view.frame.width/2, height: self.view.frame.height*0.1))

Я знаю, что мы можем каким-то образом добиться настройки ширины, используя Spacer(), .padding и edgeInsets. Но как насчет height? Я видел много учебников по SwiftUI, везде height статично. Даже на сайте Apple. SwiftUI Tutorials

Если у кого-то есть знания о том, как установить высоту пропорционально высоте вида, пожалуйста, поделитесь здесь. Потому что в какой-то момент нам это нужно. НапримерЕсли это нужно сделать кнопку в соответствии с высотой устройства. (Скажем, в iPhone SE = 40, iPhone 8P = 55, iPhone X = 65)

1 Ответ

2 голосов
/ 08 октября 2019

Вы можете использовать GeometryReader, чтобы получить эту информацию от родителя:

struct MyView: View {
    var body: some View {
        GeometryReader { geometry in
           /*
             Implement your view content here
             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)
           */
        }
    }
}

Вы можете иметь собственную структуру для вас View и привязать ее геометрию к переменной, чтобы сделать ее геометрию доступной изиз самого View.

- Пример:

Сначала определите представление с именем GeometryGetter (отдавая должное @kontiki):

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