即使 `edgesForExtendedLayout` 设置为 `top`,状态栏和 toplayout 指南底部锚点之间的差距

Posted

技术标签:

【中文标题】即使 `edgesForExtendedLayout` 设置为 `top`,状态栏和 toplayout 指南底部锚点之间的差距【英文标题】:Gap between status bar and toplayout guide bottom anchor even though `edgesForExtendedLayout` set to `top` 【发布时间】:2018-11-15 07:54:29 【问题描述】:

我有一个简单的视图控制器,它只是通过使用

进行模态渲染
viewController.present(myVC, animated: true, completion: nil)

myVC 视图控制器没有任何嵌入式导航控制器,并且在 myVCviewDidLoad 中,我正在设置应该表现得像导航栏视图的视图(不幸的是,我不能使用导航栏/导航控制器)

这是我如何以编程方式添加视图

            self.view.addSubview(topView)
            topView.translatesAutoresizingMaskIntoConstraints = false
            topView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
            topView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
            topView.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true
            topView.heightAnchor.constraint(equalToConstant: 70).isActive = true

我在viewDidLoad of myVC 中将扩展边缘指定为顶部

self.edgesForExtendedLayout = .top

用户界面看起来像

状态栏和添加的视图之间有一个空白,由黄色边框突出显示,我不确定如何修复:(

请帮忙

【问题讨论】:

This 或 this 在您将 topLayoutGuide(已弃用)更改为 safeAreaLayoutGuide 时可能会有所帮助。 【参考方案1】:

因为您将 topView 的顶部约束添加到视图的 topLayoutGuide.bottom (位于缺口下方),所以您得到了差距。所以这是预期的行为。

消除这种差距的最简单方法是将您的视图控制器嵌入UINavigationController 并使用真正的导航栏。

但如果你不能做到这一点,你必须自己消除差距。

我想不出一个优雅的方法来消除这个差距,但你可以在与差距一样高的约束中添加一个负常数:

topView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: -14).isActive = true

但您必须确保仅在 safeAreaLayoutGuide.topAnchor > 0 的设备上执行此操作。(iPhoneX 等)。在所有其他设备上,常量必须是 0

正如我所说,这不是一个非常稳定或优雅的解决方案,但它会起作用。

顺便说一句,如果可能,您应该将 self.topLayoutGuide.bottomAnchor(已弃用)更改为 view.safeAreaLayoutGuide.topAnchor

【讨论】:

非常感谢您的回复,我会尝试您的解决方案并尽快更新您,但是您是如何得出 -14 状态栏高度为 20 导航栏高度为 44 的值的,那您是怎么做到的实现 -14 是一个随机数,我应该通过试验 n 错误找到它吗? 间隙与状态栏无关。我通过反复试验找到了价值。正如我所说:不是一个非常优雅或稳定的解决方案;-) 感谢您的努力和时间,让我试试您的答案:) 很公平。我也会对更清洁的解决方案感兴趣 ;-) 这绝对是一种更清洁、更好的方法。我会将其添加到答案中,以便更明显。

以上是关于即使 `edgesForExtendedLayout` 设置为 `top`,状态栏和 toplayout 指南底部锚点之间的差距的主要内容,如果未能解决你的问题,请参考以下文章

即使满足条件并且即使目标表和源表中的字段已经存在,雪花合并也会添加数据

Xcode 测试:清理代码,即使停止

安装 bff,即使它已经安装

为啥ios build即使成功也不会在试飞中显示

iphone - 即使禁用推送通知也会出现

为啥即使没有错误,表单也会出现错误消息?