iOS15下SwiftUI部分设备Navigation title显示不全问题求助
问题根因
这个是iOS15系统SwiftUI的已知导航栏布局bug,由代码中几个不规范写法叠加触发:
- 全局
foregroundColor修饰符直接挂载到根ZStack上,被导航栏内置视图继承,干扰系统对标题区域的宽度计算 - 已废弃的
navigationBarItems修饰符在iOS15上存在布局兼容问题,自定义trailing按钮宽度会异常抢占标题区域的可用空间 navigationViewStyle修饰符错加在NavigationView的子视图上,本该作用于NavigationView本身,错误的挂载位置导致导航栏布局计算异常
修复步骤
- 移除根ZStack上的
.foregroundColor(Color.white)修饰符,将前景色设置拆分到内部需要的子视图上,避免全局样式污染导航栏 - 替换
navigationBarItems为iOS14+推荐的toolbar修饰符自定义导航栏按钮 - 将
navigationViewStyle(.stack)移动到外层的NavigationView上,不要写在子视图层 - 如果仍出现截断问题,可在toolbar中添加principal位置的EmptyView,彻底覆盖系统生成的标题控件,避免布局冲突
修复后代码示例
var body: some View { ZStack { Color(ColorConstantsName.MainThemeBgColour) .ignoresSafeArea() GeometryReader { geo in ScrollView(.vertical) { Text("Testing") .foregroundColor(.white) // 前景色加到内部子视图 } } } .navigationBarBackButtonHidden(true) .navigationTitle(CommonAllString.BlankStr) .navigationBarTitleDisplayMode(.inline) // 替换navigationBarItems为toolbar .toolbar { // 显式设置空标题视图,避免系统生成的标题Label挤占空间 ToolbarItem(placement: .principal) { EmptyView() } ToolbarItem(placement: .navigationBarLeading) { leadingButton .foregroundColor(.white) // 导航按钮单独设置前景色 } ToolbarItem(placement: .navigationBarTrailing) { trailingButton .foregroundColor(.white) // 导航按钮单独设置前景色 } } } var trailingButton: some View { HStack { Image(systemName: ImageConstantsNameForChatScreen.PersonImg) .padding(.trailing) Image(ImageConstantsName.DTRShareIconImg) .resizable() .frame(width: 20, height: 20) } } // 外层NavigationView处添加navigationViewStyle,示例: // NavigationView { // YourView() // } // .navigationViewStyle(.stack)
内容的提问来源于stack exchange,提问作者Sham Dhiman
相关产品推荐
相关产品推荐

