【问题标题】:Proportional height (or width) in SwiftUISwiftUI 中的比例高度(或宽度)
【发布时间】:2019-12-06 04:39:21
【问题描述】:

我开始探索 SwiftUI,但找不到简单的方法:我希望 View 具有成比例的高度(基本上是其父级高度的百分比)。假设我有 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 高,第三个调整为适合所有剩余空间。再说一次,这很好。 您不能(通过这种方式)指定一个比例高度。

【问题讨论】:

  • 您可以使用 GeometryReader 获取父级的大小自行计算。
  • 根据链接上的幻灯片,家长可以为孩子提议一个尺码。然后孩子管理自己并创建与该命题的大小关系。当您执行上述操作时,您会得到什么结果?
  • @impression7vx 看看编辑。

标签: ios swift autolayout swiftui


【解决方案1】:

您可以使用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())

【讨论】:

  • 感谢您的帮助。当你有机会时,你能稍微改进你的答案吗?我在这里不明白的是为什么你必须指定“layoutPriority(1)”修饰符(我知道 layoutPriority 是做什么的,但我不明白为什么这里需要它)。另外,你能看看我的 EDIT 并解释一下为什么“relativeHeight”修饰符在这里不起作用吗?再次感谢您。
  • 您必须指定layoutPriority,否则它不起作用。我不明白为什么它不工作。这可能是一个 SwiftUI 错误。我所知道的是,通过实验,我发现使用layoutPriority 可以使其工作。至于relativeHeight,它已被弃用,所以我没有兴趣研究如何使它工作。
  • 谢谢。我不知道 relativeHeight 已被弃用。对于 layoutPriority 问题,我将继续尝试找出发生了什么。
  • 似乎 beta 5 修复了 .layoutPriority() 问题,可能不再需要它来工作。
  • 刚刚将 MacOS 和 xCode 更新到 Beta 5,正如@kontiki 所建议的,不再需要 .layoutPriority() 了。 Rob,你介意更新你的答案吗?谢谢你们。
猜你喜欢
  • 1970-01-01
  • 2020-02-05
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多