如何检查一个视图是否在另一个视图的顶部?

5

目前有一个滚动视图(整个屏幕)放置在一个UIView(屏幕底部)后面。我试图检查滚动视图上的标签是否被UIView遮盖(这在iPhone SE上发生)。有没有办法检查UIView是否覆盖了滚动视图上的标签? 我尝试使用滚动视图标签的中心CGPoint来查看它是否小于UIView上的点,但是它不允许我比较两个CGPoint的大小:

if atmLabel.center < CGPoint(x: 156, y: 570) {
    buttonView.dropShadow(shadowOpacity: 0.5)
}
3个回答

10

对于点检查,您应该使用 CGRect 的 contains 函数……简而言之,这应该有效。

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

 if label.frame.contains(view.frame) {
    //Do your stuff...
 }

你可以使用这个按钮 enter image description here 在Xcode中查看视图层级。

或者你可以直接打印当前视图控制器的子视图。

print(self.view.subviews)

这将按照视图层的升序打印出UIView子类的数组... 我建议使用第一种调试方式 :)


这对于调试非常有用,但如果标签被覆盖,我需要它执行某些操作。有没有办法在代码中找出呢? - SwiftyJD

9
如果你想查看两个视图在代码中是否重叠,我认为这应该可以工作:
if view1.frame.intersects(view2.frame) {
    // handle overlap
}

5

你的视图层次结构:

parentView
- scrollView
- - label
- topView

框架矩形(frame rectangle)描述了视图在其父视图坐标系中的位置和大小。

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

你不能简单地比较labeltopView的框架,因为frame是相对于父视图的坐标位置,也就是说,topView.frame 是在 parentView 坐标系中,而 label.frame 是在 scrollView 坐标系中。

所以你需要将label转换到parentView或者将topView转换到scrollView坐标系中。让我们采用第一种变量:

let frameInParent = parentView.convert(label.frame, from: label.superview)

之后,您可以检查此框架是否与 topView 相交:

let isOverlaps = frameInParent.intersects(topView.frame)

但是,仅当您不对视图使用任何转换时才成立,因为再次查看框架文档:

警告

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接