You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:39:01