能否将NavigationView放置在ScrollView内实现对应功能?
布局冲突原因
ScrollView属于无界布局容器,在滚动方向上不会对子视图施加固定尺寸限制,会优先让子视图计算自身所需大小后再调整自身滚动区域。而NavigationView默认是自适应父容器尺寸的组件,当父容器没有明确尺寸约束时,NavigationView的尺寸计算结果为0,最终表现为页面空白。
可运行的实现方案
方案1:给内部的NavigationView添加明确尺寸约束
如果确实需要将NavigationView嵌套在ScrollView内部,只要给NavigationView加上明确的高度/宽度约束即可正常渲染:
struct ContentView: View { var body: some View { ScrollView { NavigationView { List { NavigationLink("another view", destination: ChildView()) } } // 明确约束高度,可根据业务需求调整为minHeight、maxHeight等其他约束规则 .frame(height: 400) } } }
方案2:调整嵌套层级(更推荐)
NavigationView本身是负责页面导航层级的根容器,苹果官方推荐将其放在视图层级的外层,将ScrollView嵌套在NavigationView内部即可同时满足滚动需求和导航功能,无需额外添加约束:
struct ContentView: View { var body: some View { NavigationView { ScrollView { List { NavigationLink("another view", destination: ChildView()) } .listStyle(.plain) } .navigationTitle("主页") } } }
适配说明
iOS 16及以上系统中NavigationView已被废弃,可替换为NavigationStack使用,两种方案的约束规则、嵌套逻辑完全一致。
内容的提问来源于stack exchange,提问作者Mathematical Lie
相关产品推荐
相关产品推荐

