为何UINavigationBarAppearance设不透明时safeAreaInset顶部仍不为0
底层逻辑
旧版通过UINavigationBar的isTranslucent属性控制半透明状态时,系统会自动同步适配控制器的布局规则:当isTranslucent设为false(不透明)时,控制器view的布局起点会自动对齐到导航栏底部,此时view的safeAreaInset.top自然为0,不需要额外的顶部安全区域偏移。
而iOS 13新增的UINavigationBarAppearanceAPI仅负责导航栏的视觉样式配置,默认不会触发旧版的布局适配规则:哪怕你调用了configureWithOpaqueBackground()生成了完全不透明的外观配置,控制器的edgesForExtendedLayout默认还是.all,也就是view的布局起点仍然是屏幕最顶端,所以系统会自动叠加状态栏+导航栏高度的安全区域偏移,最终表现为safeAreaInset.top大于0。
实现方案
要达到safeAreaInset.top为0的效果,任选以下一种方案即可:
- 方案1:手动调整控制器的扩展布局属性
配置完导航栏外观后,关闭当前控制器对顶部区域的扩展布局:
修改后view的布局起点会自动对齐到导航栏底部,和旧版edgesForExtendedLayout.remove(.top)isTranslucent = false的行为完全一致。 - 方案2:显式设置导航栏的
isTranslucent属性
新的Appearance API并不会覆盖isTranslucent的布局适配规则,只需要额外添加一行配置即可沿用旧逻辑:navigationController?.navigationBar.isTranslucent = false
额外注意
你贴出的代码中navigationItem.compactAppearance = appearanc存在拼写错误,末尾缺少字符e,正确写法为navigationItem.compactAppearance = appearance,需修正避免运行时异常。
内容的提问来源于stack exchange,提问作者the monk
相关产品推荐
相关产品推荐

