2013-07-26 2 views
0

나는 해결책을 찾을 수 없었던 매우 흥미로운 문제가 있습니다. 공간에서 황소 사각형 또는 상자가 지정되고 터치 좌표가 주어지면 터치 포인트가 속한 상자를 찾을 수 있습니다. 처음에는 직사각형의 중심에서 점의 유클리드 거리를 사용했습니다.iOS 우주에서 주어진 점을 가진 상자 찾기

그러나 분명히 이것이 항상 작동하지는 않습니다. 각각 센터의 A와 C로,이 상자는 다음 그림을 가정합니다

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

터치 포인트는 "X"이며 "은"을 상자에 속한다. 내 알고리즘으로, x는 a보다 c에 가장 가깝습니다. 제안 사항이 있으십니까?

+2

이렇게 복잡해지고있는 것처럼 들리 네요. 터치 이벤트를 캡처하면 touch.view가 상자 a 또는 상자 c와 같은지 확인할 수 있습니다. 어쩌면 UITapGestureRecognizer (클래스라고 생각합니다)를 살펴보고 제스처 인식기를 추가하십시오. – JeffRegan

답변

2

CGRectContainsPoint 메서드는 모든 작업을 수행합니다. 예를 들어 탭 제스쳐를 사용했다고 가정 해보십시오.

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

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

    if (CGRectContainsPoint(box.frame, point)) { 
     [email protected]("Point is in Box"); 
    }  
} 
+1

나를 이길 : – danielbeard

+0

설명서를 읽는 데 익숙해 져야합니다! 빠른 답변을 보내 주셔서 감사합니다! – giuseppe

0

상자 중심까지 거리를 사용할 수 없다는 것을 알고 있습니다. 당신은 멋진 코드이 자신이나 당신이 CGRectContainsPoint()

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 
} 
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"); 
}  
관련 문제