SwiftUI中外部构建的视图嵌入HStack时PreferenceKey不生效如何解决
问题原因
iOS 14 版本的 SwiftUI 布局存在特性:外部构造的视图(属性存储的视图、自定义结构体视图)在渲染链路中会先上报一次CGSize.zero的无效偏好值,你原有DimensionsKey的reduce逻辑直接用新值覆盖旧值,就会把之前上报的正确尺寸覆盖为0,导致读取失败。
修复方法
修改DimensionsKey的reduce逻辑,过滤掉无效的0值,只有新上报的尺寸不为0时才更新累计值:
struct DimensionsKey: PreferenceKey { static var defaultValue: CGSize = .zero static func reduce(value: inout CGSize, nextValue: () -> CGSize) { let newSize = nextValue() // 过滤无效的0值,避免覆盖正确尺寸 guard newSize != .zero else { return } value = newSize } typealias Value = CGSize }
修改完成后三个示例都可以正常读取到内容尺寸。
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

