iOS 检查一个view 是否在 一个 圆 的范围内

检查两个UIView是否有交集 ,我记得有一个直接可以用的API。求指教

阅读 5.5k
4 个回答

如果是用于视图本身的判断,楼上的方法够用了,如果是想判断 矩形和圆形的交集问题,其实还有有些小复杂的,我搜集了一些资料,封装了一个方法,可以直接在自己的项目中用,特定场景下,是很有用的:

我封装了一个代码,可以直接拿到自己项目中直接用:

/**
 *  计算任意圆和矩形是否有交集.
 *
 *  @param rect   矩形的边框.
 *  @param center 圆心.
 *  @param r      圆的半径.
 *
 *  @return YES,圆和矩形有交集; NO,圆和矩形无交集.
 */

- (BOOL) boxCircleIntersectWithRect:(CGRect) rect
                             center: (CGPoint) center
                                  r: (double) r
{
    // 初始输入.
    double c[] = {rect.origin.x + rect.size.width / 2.0, rect.origin.y + rect.size.height / 2.0}; // 矩形中心向量.
    double h[] = {rect.size.width / 2.0, rect.size.height / 2.0};; // 矩形半长向量,即从矩形中心到矩形顶点的向量.
    double p[] = {center.x, center.y}; // 圆心向量.
    
    double v[] = {0, 0}; // 圆心与矩形中心的向量表示.
    double u[] = {0, 0};  // 圆心与矩形最短距离的矢量
    
    // 第一步: 转换至第一象限.
    vDSP_vsubD(c, 1, p, 1, v, 1, 2);
    vDSP_vabsD(v, 1, v, 1, 2);
    
    // 第二步: 求圆心至矩形的最短距离矢量.
    vDSP_vsubD(h, 1, v, 1, u, 1, 2);
    double zero[] = {0.0, 0.0};
    vDSP_vmaxD(u, 1, zero, 1, u, 1, 2);
    
    // 第三步: 长度平方与半径平方比较
    double dotResult = 0.0;
    
    vDSP_dotprD(u, 1, u, 1, &dotResult, 2);
    double powR = pow(r, 2);
    
    BOOL result = (dotResult <= powR );
    
    return result;
}

算法灵感来源于知乎,不过它是用伪码实现的,参见: 怎样判断平面上一个矩形和一个圆形是否有重叠?
需要用到 iOS 向量操作的相关知识,可以看下CSDN这篇文章:
IOS中的矩阵和向量运算
更多讨论,参见: iOS 检查一个view 是否在 一个 圆 的范围内

CGPathContainsPoint 应该就可以,应该和CGRectContainsPoint一样

CGPathContainsPoint(<#CGPathRef _Nullable path#>, <#const CGAffineTransform * _Nullable m#>, <#CGPoint point#>, <#bool eoFill#>)

如果只是判断是否有交集就用CGRectIntersectsRect(),如果判断在某一个点在范围内用楼上那个

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题