我目前有一个LazyVGrid
设置如下:
struct NetworkGrid: View {
var networks: [Network]
let columns = [
GridItem(.flexible()),
GridItem(.flexible()),
GridItem(.flexible()),
GridItem(.flexible())
]
var body: some View {
ScrollView {
LazyVGrid(columns: columns) {
ForEach(networks) { network in
NetworkCard(network: network)
}
}
}
}
}
字符串
我想根据当前窗口大小设置网格列数,即
func windowDidResize(_ notification: Notification) {
itemWidth = CGFloat(300)
if window.width <= itemWidth {
GridItem(.flexible()), GridItem(.flexible())
} else if window.width <= itemWidth * 2 {
GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible())
} else if window.width <= itemWidth * 3 {
GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible())
}
...
}
型
我该如何在SwiftUI中实现这样一个观察者?
3条答案
按热度按时间yeotifhr1#
不使用GeometryReader也可以做到这一点:
字符串
spacing
没有像我预期的那样工作,但可能有一个很好的解决方案。我也不确定动态大小的元素在这里的表现如何。静态大小是伟大的,虽然!x1c 0d1x的数据
9rygscc12#
如果要在视图调整大小时更新
@State
或@ObservedObject
变量,可以使用onAppear(perform:)以初始视图大小更新变量,并使用onChange(of:perform:)检测视图大小更改:字符串
w9apscun3#
监听窗口大小的SwiftUI等价物可能是使用
GeometryReader
。在您的示例中,您可以读取大小并根据其宽度阅读动态决定列:字符串