SwiftUI:将窗口宽高比与子视图绑定

时间:2019-12-14 19:07:07

标签: swift swiftui

如何修改SwiftUI窗口以尊重子视图的长宽比?窗口应始终与所包含的contentView一样高,并根据需要调整其宽度?

使用情节提要,这就像设置contentView的纵横比并将所有侧面的约束都设置为0一样容易-窗口将根据需要缩放,并保持子视图的纵横比。如何使用SwiftUI完成此操作?

我尝试使用PreferenceKey将宽度的值传递回视图树,以根据需要调整窗口的大小。但是,传递的值始终为0。调整窗口大小时,会生成更多值,但它们也是0

struct WidthPreferenceKey: PreferenceKey {

    typealias Value = CGFloat

    static var defaultValue: Value = .zero

    static func reduce(value: inout Value, nextValue: () -> Value) {
        value = nextValue()
    }
}

struct ContentView: View {

    var contentView: some View {
        Rectangle()
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(
                GeometryReader { geometry in
                    Color.clear
                        .preference(key: WidthPreferenceKey.self, value: geometry.size.width)
                }
            )
    }


    var body: some View {
        HSplitView {
            contentView
                .aspectRatio(16/9, contentMode: .fit)
            someTabView
                .frame(width: 300)
        }.onPreferenceChange(WidthPreferenceKey.self) { value in
            print(value)
        }.frame(maxWidth: .infinity, maxHeight: .infinity)
    }

}

1 个答案:

答案 0 :(得分:0)

使用.aspectRatio(nil)修饰符。 nil参数告诉视图to maintain its aspect ratio