实战需求
SwiftUI 高级用法之如何捕获截取事件实现隐藏收起展开
本文价值与收获
看完本文后,您将能够作出下面的界面
基础知识
SwiftUI提供了PreferenceKeys的功能,这是SwiftUI通过视图树传递信息的方式。PreferenceKey 是一种通用协议,需要一个静态函数和一个静态默认值:
struct SizePreferenceKey: PreferenceKey {
static var defaultValue: CGSize = .zero
static func reduce(value: inout CGSize, nextValue: () -> CGSize) {}
}
- defaultValue 是当视图对此键没有显式值时使用的值
- reduce(value:nextValue:) 将树中找到的键值与新的键值相结合
PreferenceKey示例,存储孩子的实际尺寸:
var body: some View {
childView
.background(
GeometryReader { geometryProxy in
Color.clear
.preference(key: SizePreferenceKey.self, value: geometryProxy.size)
}
)
}
SwiftUI提供了View扩展名,onPreferenceChange(_:perform:)使我们可以指定所需的键,以及在首选项更改时执行的代码块:
var body: some View {
childView
.background(
GeometryReader { geometryProxy in
Color.clear
.preference(key: SizePreferenceKey.self, value: geometryProxy.size)
}
)
.onPreferenceChange(SizePreferenceKey.self) { newSize in
print("The new child size is: \(newSize)")
}
}