如何修改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)
}
}