Swift - 如何检查 CAShapeLayer 是否与按钮 (UIView) 相交?

Swift - How to check if a CAShapeLayer intersects with a button (UIView)?

如标题所述,我无法检查按钮是否与 CAShapeLayer 相交。现在我有一个通过 UIPanGestureRecognizer 移动的按钮。当它放开时,我想检查它是否在我拥有的这个轮子上的某种颜色之上: Simulator View

颜色生成为 CAShapeLayers,代码如下:

let path1 = UIBezierPath()
path1.addArc(withCenter: center, radius: 50, startAngle: CGFloat.pi/4 + 0.1, endAngle: CGFloat.pi*3/4 - 0.1, clockwise: true)
path1.addArc(withCenter: center, radius: 125, startAngle: CGFloat.pi*3/4 - 0.05, endAngle: CGFloat.pi/4 + 0.05, clockwise: false)
blueCircle.path = path1.cgPath
blueCircle.fillColor = UIColor(red: 0, green: 143/255, blue: 208/255, alpha: 1).cgColor
self.view.layer.addSublayer(blueCircle)

其中 blueCircle 是一个 CAShapeLayer。

我有代码检查我的“识别器”(UIPanGestureRecognizer) 在发布时是否重叠,看起来像这样:

   if recognizer.view!.frame.intersects(blueCircle.frame) {
       print("Blue overlap")
   }

但我怀疑它总是 returns 错误,因为它们不在同一“层”中。我尝试了多种方法,包括使用边界而不是框架,并尝试使用手势识别器的中心进行转换,但它似乎无法正常工作。

您需要检查与主视图的相交 (self.view)

你也可以试试这个

- (BOOL)checkViewIntersectsWithAnotherView:(UIView*)selectedView {

    NSArray *subViewsInView = [self.view subviews];// I assume self is a subclass
                                       // of UIViewController but the view can be
                                       //any UIView that'd act as a container 
                                       //for all other views.

     for(UIView *theView in subViewsInView) {

       if (![selectedView isEqual:theView])
           if(CGRectIntersectsRect(selectedView.frame, theView.frame))  
              return YES;
    }

  return NO;
}

因此,对于 运行 遇到此问题的任何人,我设法找到了解决方案。似乎您可以在 CAShapeLayers 上调用框架,但是当我检查打印输出时,它给了我“(0,0,0,0)”。我最终用

替换了调用 frame 的代码
if self.view.intersects((blueCircle.path?.boundingBox)!) {
    print("Blue overlap")
}

所以我正在寻找路径,这非常有效。