Xcode12项目导入Xcode13 beta5后NavigationView顶部出现多余内边距
问题原因
该偶发异常是Xcode 13 Beta链接iOS 15 SDK后,NavigationView默认行为变更引发的适配bug:
- Xcode 12编译时使用iOS 14及更早版本的SDK,导航栏默认采用不透明样式,内容顶部与导航栏底部的间距计算逻辑固定,不会出现该问题
- iOS 15新增了导航栏滚动适配特性,默认状态下导航栏为透明样式,仅当内容滚动到导航栏下方时才会切换为不透明样式,这套新的内边距计算逻辑存在缺陷,运行过程中状态变化时就会随机出现多余顶部间距
- 手动重启应用后多余间距临时消失,是因为初始化时样式计算暂时正确,后续运行触发逻辑缺陷后问题会再次复现
修复方案
方案1:全局统一导航栏样式(最稳定,推荐)
在应用入口的初始化方法中强制统一导航栏样式,覆盖iOS 15的默认适配规则:
@main struct PasswordApp: App { init() { if #available(iOS 15, *) { let navBarAppearance = UINavigationBarAppearance() // 沿用iOS14及更早版本的不透明导航栏样式 navBarAppearance.configureWithOpaqueBackground() UINavigationBar.appearance().standardAppearance = navBarAppearance UINavigationBar.appearance().scrollEdgeAppearance = navBarAppearance } } var body: some Scene { WindowGroup { ContentView() } } }
方案2:单页面针对性修复
如果不需要全局修改导航栏样式,可以直接修改当前页面的NavigationView配置,强制指定样式规避计算bug:
struct ContentView: View { var body: some View { NavigationView{ VStack { ForEach(data) { item in Text(item.category) } } .navigationBarTitle("My Passwords") // 强制使用inline标题模式,规避大标题模式的内边距计算bug .navigationBarTitleDisplayMode(.inline) } // 强制使用栈式导航样式,规避iOS15默认自适应双栏样式的适配问题 .navigationViewStyle(.stack) } }
内容的提问来源于stack exchange,提问作者Amey Sunu
相关产品推荐
相关产品推荐

