我有'关于'控制器使用状态栏下方的导航栏。出于某种原因,我必须将View的背景颜色设置为导航栏的相同颜色,否则状态栏的背景将为白色。这个技巧在其他设备上运行正常,但在iPhoneX的横向视图中却没有。如下所示:
如果我将View的背景设置为白色,则会出现其他问题:
看起来这是一个问题,我在View中有导航栏作为如下所示的故事板结构:
但我似乎无法将导航栏移动到与View相同的级别。有什么想法吗?
答案 0 :(得分:5)
您的UINavigationBar
很可能固定在视图的safeAreas上。这里有几点需要考虑:
目前,您的视图固定在其超级视图的安全区域内。在iPhone X上,即:
UIEdgeInsets(top: 44, left: 0, bottom: 34, right: 0)
在横向 UIEdgeInsets(top: 0, left: 44, bottom: 21, right: 44)
因此,这正是您的观点最终结束的地方:
safeAreaInsets.bottom
中的值并不重要,因为navigationBar很可能不会扩展到其超级视图的底部。
好的,现在让我们将视图固定到其超视图的边缘而不是安全区域插图:
这就是我们最终的结果:
看起来很适合风景,但是什么是肖像?注意条形按钮如何位于状态栏内。
好吧,布局系统正在完成你要告诉它的事情(如果一直都是这样,那么编写iOS将是轻而易举的事情:D)。它将视图固定在其超级视图的顶部,忽略任何layoutMargin
或safeAreaInsets
。但是对于UINavigationBar
,这不是我们想要的。我们希望条形图的内容从任何safeAreaInset.top
开始,以便它不会干扰状态栏,例如。
解决方案是将顶部约束恢复为相对于safeArea'。 navigationBar的内容现在看起来不错。为了向上扩展navigationBar的背景,您可以设置navigationBars委托(UINavigationBarDelegate
)并提供以下实现:
func position(for bar: UIBarPositioning) -> UIBarPosition {
return .topAttached
}
通过返回.topAttached
,您可以告诉navigationBar在状态栏下方向上展开其背景(模糊视图)。
结果:
请注意,一般情况下,如果可能,最好使用UINavigationController
。这整个布局舞蹈都是为您完成的,另外在一个视图中添加一个简单的UINavigationBar
对于大型游戏也不会很好。他们需要一个navigationController来提供崩溃和扩展逻辑。
关于这个主题的一些补充说明:
UINavigationBar
尊重这些并相应地插入其内容。对于垂直插图,它不会这样做,这就是为什么我们必须进行上述舞蹈。Preserve Superview Margins
。同样,如果您只是首先使用UINavigationController
,系统会为您处理所有这些事情。 答案 1 :(得分:4)
答案 2 :(得分:1)
isTranslucent
默认设置为true
。将其设置为false
将使导航栏扩展到状态栏下方。
navigationBar.isTranslucent = false
答案 3 :(得分:0)
看起来独立的导航栏只适用于这种情况。将其更改为导航项后修复了该问题。为了使它成为导航项目,我选择现有的控制器(带有导航栏的控制器)并通过“编辑器 - >嵌入”将其嵌入到导航控制器中。
答案 4 :(得分:0)
CodingMeSwiftly答案的初学者摘要和一些解释:
在viewDidLoad方法或类似方法的ViewController类中,您必须分配一个委托(或在情节提要中进行委托):
navigationBar.delegate = self //其中NavigationBar是IBOutlet
为您的ViewController类添加扩展名:
扩展ViewController:UINavigationBarDelegate { 功能位置(用于栏:UIBarPositioning)-> UIBarPosition { 返回.topAttached } }
检查故事板上的导航栏顶部约束是否为“安全区域”。顶部
对我有用。