SwiftUI中TabView嵌入NavigationView后内容向下偏移该如何解决?
异常效果如下图:
问题原因
- TabView专属修饰符位置错误:
.tabViewStyle、.indexViewStyle是作用于TabView的修饰符,你将其放在NavigationView外层,修饰符作用对象错误,会导致TabView布局逻辑异常 - 安全区忽略规则配置错误:
.ignoresSafeArea()加在NavigationView外层仅作用于NavigationView本身,不会改变其内部内容容器的默认规则:NavigationView的内容容器默认会自动避开导航栏,内部子视图默认以导航栏下方的区域作为布局基准,文本只能在该区域内居中,自然会整体向下偏移 - 子视图高度未撑满:TabView内的Text默认仅包裹自身内容,没有撑满父容器的高度,无法做到全屏幕垂直居中。
修复方案
按如下规则调整代码即可解决偏移问题,且不会影响原有功能:
- 将TabView专属的修饰符移到TabView自身的修饰链上
- 给TabView内的每个子页面添加
frame(maxHeight: .infinity)撑满全部可用高度,同时添加.ignoresSafeArea()让子页面可以延伸到导航栏下方区域,将布局基准改为整个屏幕高度 - 移除NavigationView外层的全局
ignoresSafeArea(),避免导航栏展示异常
修正后代码
var body: some View { NavigationView{ TabView { Text("TEST 1") .foregroundColor(color) .font(Font.custom("Catamaran-ExtraBold", size: 48)) .navigationTitle("TEST 1") .frame(maxHeight: .infinity) .ignoresSafeArea() Text("TEST 2") .foregroundColor(color) .font(Font.custom("Catamaran-ExtraBold", size: 48)) .navigationTitle("TEST 2") .frame(maxHeight: .infinity) .ignoresSafeArea() } .tabViewStyle(.page) .indexViewStyle(.page(backgroundDisplayMode: .always)) .foregroundColor(.black) .navigationBarTitleDisplayMode(.inline) .font(Font.custom("Catamaran-ExtraBold", size: 20)) .navigationBarItems( leading: NavigationLink(destination: SettingsView(), label: { Image(systemName: "gearshape") }) ) .foregroundColor(colorScheme == .dark ? .white : .black) } .navigationViewStyle(.stack) }
调整后文本会以设备整个屏幕的垂直中心作为对齐基准,偏移问题消失,翻页、导航跳转等原有功能全部正常。
内容的提问来源于stack exchange,提问作者idris
相关产品推荐
相关产品推荐


