即使 `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 视图控制器没有任何嵌入式导航控制器,并且在 myVC
的 viewDidLoad
中,我正在设置应该表现得像导航栏视图的视图(不幸的是,我不能使用导航栏/导航控制器)
这是我如何以编程方式添加视图
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 指南底部锚点之间的差距的主要内容,如果未能解决你的问题,请参考以下文章