iOS查找给定空间点的框

时间:2013-07-26 15:17:07

标签: ios touch

我有一个非常有趣的问题,我无法找到解决方案。 给定一个牛角矩形或空格框,并给出触摸的坐标,我会找到触摸点所属的框。 起初,我使用了从矩形中心开始的点的欧氏距离。

但是,显然,这并不总是有效。假设下图有两个框,分别为中心a和c:

----------
|        |
|        |
|   a    |
|        |
|        |
|   x    |
----------
|        |
|   c    |
|        |
----------

触摸点为“x”,属于框“a”。使用我的算法,x最接近c而不是a,这是错误的。 有什么建议?

4 个答案:

答案 0 :(得分:2)

CGRectContainsPoint方法为您完成所有工作。比如说你使用了一个轻击手势。

-(void)handleTap:(UITapGestureRecognizer *)gesture {

    CGPoint point = [gesture locationInView:self.view];

    if (CGRectContainsPoint(box.frame, point)) {
       NSLog@("Point is in Box");
    }       
}

答案 1 :(得分:1)

这个答案基于你使用视图的假设,而不是你正在处理包含不同矩形区域的模型。

您只需遍历框列表,然后使用函数BOOL CGRectContainsPoint(rect, point);

例如(假设您的矩形在NSValues中装箱,存储在NSArray中):

NSArray* arrayOfRects = ...;
CGPoint point = CGPointMake(xTouch, yTouch);

CGRect rectResult = CGRectNull;

for (NSValue* rectObj in arrayOfRects) {
    CGRect rect = [rectObj CGRectValue];
    if (CGRectContainsPoint(rect, point)) {
        rectResult = rect;
        break;
    };
}

if (!CGRectEqualToRect(rectResult, CGRectNull)) {
    // Found a matching rect!
}
else {
    // Touch was outside of any recognised rect
}

此解决方案不会处理重叠的矩形。如果你需要这个,你需要保留一系列匹配,如下:

NSArray* arrayOfRects = ...;
CGPoint point = CGPointMake(xTouch, yTouch);

NSMutableArray* rectResultArray = [NSMutableArray array];

for (NSValue* rectObj in arrayOfRects) {
    if (CGRectContainsPoint([rectObj CGRectValue], point)) {
        [rectResultArray addObject:rectObj];
    };
}

if (rectResultArray.count > 0) {
    // Found matching rects!
}
else {
    // Touch was outside of any recognised rect
}

答案 2 :(得分:0)

你是对的意识到你不能使用到盒子中心的距离。您可以尝试自己想象并自己编写代码,也可以使用预制函数CGRectContainsPoint()

答案 3 :(得分:0)

你可以使用它。

//get the location of the touch
touch = [[event allTouches] anyObject];
location = [touch locationInView:view];

//check if touchpoint belongs to a box
if (CGRectContainsPoint(self.boxA.frame, location))
{
     NSLog(@"Touchpoint is in box A");
}
else if (CGRectContainsPoint(self.boxB.frame, location))
{
     NSLog(@"Touchpoint is in box B");
}
else
{
     NSLog(@"Touchpoint is not in box");
}