代码之家  ›  专栏  ›  技术社区  ›  superpuccio Kasra

SwiftUI中的比例高度(或宽度)

  •  0
  • superpuccio Kasra  · 技术社区  · 6 年前

    我开始探索SwiftUI,但我找不到一个简单的方法:我希望视图的高度与父视图的高度成比例(基本上是父视图高度的百分比)。假设我有3个垂直堆叠的视图。我想要:

    • 第一个是43%(其父母的身高)高
    • 第二个孩子的身高为父母身高的37%
    • 最后一个孩子的身高是父母身高的20%

    我在WWDC19上观看了这段关于SwiftUI中自定义视图的有趣视频( https://developer.apple.com/videos/play/wwdc2019/237/ )我明白(如果我错了,请纠正我)基本上一个视图本身没有大小,大小是它的子视图的大小。因此,父视图会询问其子视图的高度。他们的回答是:“你身高的一半!”然后。。。什么布局系统(与我们使用的布局系统不同)如何管理这种情况?

    如果您编写以下代码:

    struct ContentView : View {
        var body: some View {
            VStack(spacing: 0) {
                Rectangle()
                    .fill(Color.red)
                Rectangle()
                    .fill(Color.green)
                Rectangle()
                    .fill(Color.yellow)
            }
        }
    }
    

    SwiftUI布局系统将每个视图的大小设置为1/3高,这与我在上面发布的视频是一致的。 可以通过以下方式将矩形包裹在框架中:

    struct ContentView : View {
        var body: some View {
            VStack(spacing: 0) {
                Rectangle()
                    .fill(Color.red)
                    .frame(height: 200)
                Rectangle()
                    .fill(Color.green)
                    .frame(height: 400)
                Rectangle()
                    .fill(Color.yellow)
            }
        }
    }
    

    这样,布局系统将第一个矩形的大小设置为200高,第二个矩形的大小设置为400高,第三个矩形的大小设置为适合所有剩余空间。再说一次,这很好。 你不能(用这种方式)指定成比例的高度。

    0 回复  |  直到 4 年前
        1
  •  93
  •   superpuccio Kasra    6 年前

    你可以利用 GeometryReader .将读者环绕在所有其他视图周围,并使用其闭包值 metrics 要计算高度:

    let propHeight = metrics.size.height * 0.43
    

    使用方法如下:

    import SwiftUI
    
    struct ContentView: View {
        var body: some View {
            GeometryReader { metrics in
                VStack(spacing: 0) {
                    Color.red.frame(height: metrics.size.height * 0.43)
                    Color.green.frame(height: metrics.size.height * 0.37)
                    Color.yellow
                }
            }
        }
    }
    
    import PlaygroundSupport
    
    PlaygroundPage.current.liveView = UIHostingController(rootView: ContentView())