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

SwiftUI 同时使用自定义转场与自定义id时系统布局失效问题求助

问题成因
  • 自定义转场用到的CustomLeadingOffset、CustomTrailingOffset两个ViewModifier内部使用了GeometryReader,默认情况下GeometryReader会尽可能撑满父视图提供的所有可用空间,而非匹配内部内容的尺寸
  • 当transition和id修饰器同时使用时,SwiftUI的布局系统会优先读取转场active状态下的视图尺寸作为布局计算依据,GeometryReader的撑满特性就会把父VStack的布局边界撑开,导致蓝色背景无法贴合Text实际大小
解决方案

直接给两个自定义ViewModifier内部的GeometryReader添加.fixedSize()修饰,让GeometryReader匹配内部content的实际大小,不会撑开父容器即可:

struct CustomLeadingOffset: ViewModifier {
    var percent: CGFloat = 0
    func body(content: Content) -> some View {
        GeometryReader { geo in
            content.offset(CGSize(width: -geo.size.width*self.percent, height: 0.0))
        }
        // 新增这行,限制GeometryReader尺寸匹配内容大小
        .fixedSize()
    }
}

struct CustomTrailingOffset: ViewModifier {
    var percent: CGFloat = 0
    func body(content: Content) -> some View {
        GeometryReader { geo in
            content.offset(CGSize(width: geo.size.width*self.percent, height: 0.0))
        }
        // 新增这行,限制GeometryReader尺寸匹配内容大小
        .fixedSize()
    }
}
补充说明

该布局异常仅存在于iOS14及对应版本的SwiftUI中,升级到Xcode13+、适配iOS15及以上系统时该问题已被官方修复,无需额外修改代码也可正常运行。

内容的提问来源于stack exchange,提问作者Damien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:18:03