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

时间:2017-09-26 22:42:54

标签: ios swift scrollview frame cgpoint

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

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

3 个答案:

答案 0 :(得分:4)

对于点检查,您应该使用

包含CGRect的功能......总之这应该可行

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

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

您可以使用此按钮enter image description here

将视图hiearchy与Xcode一起使用

或者您只需打印出当前的viewController子视图

即可
print(self.view.subviews)

这打印出UIView子类的数组,按视图层的升序排序...我推荐第一种调试方法:)

答案 1 :(得分:4)

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

if view1.frame.intersects(view2.frame) {
    // handle overlap
}

答案 2 :(得分:3)

您的视图层次结构:

parentView
- scrollView
- - label
- topView
  

框架矩形,用于描述视图在其父视图的坐标系中的位置和大小。

     

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

您不能简单地比较labeltopView的帧,因为frame在超级视图坐标中的位置,又topView.frameparentView坐标中并且{ {1}}在label.frame坐标中。

因此,您需要将scrollView转换为label或将parentView转换为topView坐标。让我们来看第一个变体:

scrollView

之后,您可以检查此框架是否与let frameInParent = parentView.convert(label.frame, from: label.superview) 的相交:

topView

但这仅在不对视图进行任何变换的情况下才适用,因为再次框架文档:

  

警告

     

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