如何检查一个视图是否在另一个视图之上?

Swi*_*yJD 2 frame scrollview cgpoint ios swift

当前,有一个滚动视图(整个屏幕)位于uiview(屏幕的底部)后面。我正在尝试检查uiview是否覆盖了滚动条上的标签(iphone se会发生这种情况)。有没有办法检查uiview是否覆盖了滚动视图上的标签?我尝试使用中央cgpoint在滚动视图上查看标签是否小于uiview上的一个点,但是它不允许我比较两个cgpoints的大小:

if atmLabel.center < CGPoint(x: 156, y: 570) {
    buttonView.dropShadow(shadowOpacity: 0.5)
}
Run Code Online (Sandbox Code Playgroud)

Dom*_*her 5

对于点检查,您应该使用

包含CGRect的功能...总之这应该工作

 let view = UIView()
 let label = UILabel()

 if label.frame.contains(view.frame) {
    //Do your stuff...
 }
Run Code Online (Sandbox Code Playgroud)

您可以通过此按钮将视图层次结构与Xcode一起使用 在此处输入图片说明

或者您可以简单地在当前viewController子视图上打印出来

print(self.view.subviews)
Run Code Online (Sandbox Code Playgroud)

这会打印出按视图上层的升序排序的UIView子类数组。我建议调试的第一种方法:)


Cha*_*tka 5

如果您想查看代码中是否有两个视图重叠,我认为这应该可行:

if view1.frame.intersects(view2.frame) {
    // handle overlap
}
Run Code Online (Sandbox Code Playgroud)


Man*_*ear 5

您的视图层次结构:

\n\n
parentView\n- scrollView\n- - label\n- topView\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

框架矩形,描述了 view\xe2\x80\x99s 在其 superview\xe2\x80\x99s 坐标系中的位置和大小。

\n\n

https://developer.apple.com/documentation/uikit/uiview/1622621-frame

\n
\n\n

您不能简单地比较label和 的帧topView,因为frame是 超级视图坐标中的位置,又名topView.frameparentView坐标 和label.framescrollView坐标。

\n\n

因此,您需要将其转换labelparentViewtopView坐标scrollView。让我们使用第一个变体:

\n\n
let frameInParent = parentView.convert(label.frame, from: label.superview)\n
Run Code Online (Sandbox Code Playgroud)\n\n

之后您可以检查该框架是否与topView\'s 相交:

\n\n
let isOverlaps = frameInParent.intersects(topView.frame)\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这仅在您不在视图上使用任何转换时才成立,因为再次框架文档:

\n\n
\n

警告

\n\n

如果变换属性不是恒等变换,则该属性的值未定义,因此应被忽略。

\n
\n