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
相关产品推荐
相关产品推荐

