没有安全区域无法查看 maxX

Posted

技术标签:

【中文标题】没有安全区域无法查看 maxX【英文标题】:Can't get view maxX without safe area 【发布时间】:2021-07-28 13:09:20 【问题描述】:

我正在尝试获取视图的 maxX 以进行计算,但是尽管视图位于堆栈视图内(与其他视图一起)并且约束不在安全区域内(而且看起来也是如此)时我在做

self.frame.maxX

在我看来,它让我看到 maxX + 安全区域 x.. (我查过了)

有人知道原因并有解决办法吗?

-------------

编辑:

感谢@Sweeper,我明白我的错误和我需要什么:

self.bounds.maxX

这个给出正确的 maxX。

---------------

谢谢, 大卫

【问题讨论】:

【参考方案1】:

假设视图实际显示在屏幕上,可以将视图的safeAreaInsets应用到视图的bounds,然后将生成的矩形转换为superview的坐标空间,也就是frame的坐标空间。

let safeBounds = someView.bounds.inset(by: someView.safeAreaInsets)
let safeFrame = someView.superview?.convert(safeBounds, from: someView)
let maxX = safeFrame?.maxX

来自docs:

视图的安全区域反映了导航栏、标签栏、工具栏和其他遮挡视图控制器视图的祖先未覆盖的区域。您可以通过将此属性中的插图应用于视图的边界矩形来获得视图的安全区域。

【讨论】:

首先,谢谢。我试过了,但没有用。例如 iPhone 11:视图中的 maxX = 784。实际 maxX = 675(来自点击检查)。您的 maxX = 有 632,无论我使用什么手机/平板电脑,它都不会改变。还有什么想法吗? @David 介意展示你如何“点击检查”这个? (即您使用的代码)这将用作minimal reproducible example。 @David Umm, location(in: self) 为您提供self 坐标空间中的点,这是与self.frame 所在的坐标系不同的坐标系(与@ 相同) 987654332@)。那么,您是要在安全区域内找到self.bounds.maxXself.frame.maxX 吗? @David 我认为这里的问题是你没有正确描述你想要什么。我认为您应该显示您想要的哪个矩形的 maxX 的图片,在哪个坐标系中(即从哪个原点测量坐标)。以防万一您不知道,视图的frame 在其父视图的坐标系中,而其bounds 在视图自己的坐标系中。也许您正在混淆坐标系? @David 你太早获得这些值了。视图尚未正确布局。参见例如this。一般的答案是将获取这些测量值的代码放在一个方法中,该方法将在视图布局正确后调用,例如this 或this。如果您在尝试这些后仍有问题,请发布一个新问题。

以上是关于没有安全区域无法查看 maxX的主要内容,如果未能解决你的问题,请参考以下文章

添加 TabView 使导航栏无法覆盖 SwiftUI 中的安全区域

Ionic iPhone X 安全区域无法正常工作

为啥安全区域没有覆盖 iPad Pro 12.9" 上的屏幕宽度 [关闭]

iOS11中没有状态栏的导航栏与安全区域重叠

不将 WKWebView 保持在安全区域内的约束

自动布局:顶部边缘固定到安全区域时没有反弹效果