我有一个非常有趣的问题,我无法找到解决方案。 给定一个牛角矩形或空格框,并给出触摸的坐标,我会找到触摸点所属的框。 起初,我使用了从矩形中心开始的点的欧氏距离。
但是,显然,这并不总是有效。假设下图有两个框,分别为中心a和c:
----------
| |
| |
| a |
| |
| |
| x |
----------
| |
| c |
| |
----------
触摸点为“x”,属于框“a”。使用我的算法,x最接近c而不是a,这是错误的。 有什么建议?
答案 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");
}