2009-06-11 5 views
4

UIImageView가 있고 사용자가 이미지를 탭한 경우를 알고 싶습니다. touchesBegan에서 나는 다음과 같은 일을하지만 항상 첫 번째 조건으로 끝납니다. 창이 세로 모드이고 이미지가 맨 아래에 있습니다. 나는 창 오른쪽 위를 탭할 수 있으며 여전히 매우 잘못된 것처럼 보이는 첫 번째 조건으로 진행합니다.포인트가 Rect에 없지만 CGRectContainsPoint에 예라고 표시됩니다.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
UITouch *touch = [touches anyObject]; 
CGPoint location = [touch locationInView:touch.view]; 

if(CGRectContainsPoint(myimage.frame, location) == 0){ 
//always end up here 
} 
else 
{ //user didn't tap inside image} 

과 값은 다음과 같습니다

location: x=303,y=102 
frame: origin=(x=210,y=394) size=(width=90, height=15) 

어떤 제안?

답변

19

우선 동일하지 않습니다.

CGPoint location = [touch locationInView:self]; // or possibly myimage instead of self. 

다음으로 CGRectContainsPoint는 부울을 반환하므로 0과 비교하면 매우 이상합니다.

if (CGRectContainsPoint(myimage.frame, location)) { 
    // inside 
} else { 
    // outside 
} 

그러나 자기가 다음 myimage을하지 않은 경우 myimage을보기는 대신 터치를 받고있을 수 있습니다 - 객체 자체가 그것이 무엇인지 질문로부터 명확하지있는 UIImageView의 서브 클래스에서되지 않습니다 : 그것은해야한다 문제.

+1

docs에 따르지 않음 : developer.apple.com/documentation/graphicsimaging/... "지정된 점이 지정된 사각형 내에 있으면 1을 반환하고, 그렇지 않으면 0을 반환합니다." 위의 코드를 self.view와 함께 사용하면 UIViewController가됩니다. 감사. – 4thSpace

+0

4thSpace : 정확합니다. 점이 사각형 밖에 있기 때문에 0을 반환합니다 (따라서 동등 함이 참입니다). 점이 사각형 내부에 있으면 CGRectContainsPoint는 true (1)을 반환하고 등호는 false가됩니다. –

+0

이미지가 화면을 채우지 않으면 여기서 제시 한 논리가 작동하지 않는다고 언급 할 가치가 있다고 생각합니다. '[touch locationInView : self]'는 뷰 x, y 좌표 평면에 상대적인 포인트를 제공하지만, myimage.frame은 superview에 상대적입니다. – BBonifield

4

귀하의 논리는 단순히 반전됩니다. CGRectContainsPoint() 메서드는 bool을 반환합니다. 즉 "예"의 경우 true입니다.

UITouch *touch = [[event allTouches] anyObject]; 

다음, 당신은 이미지보기로 locationInView 상대에 대한 검사 싶은 : 사실 당신과 함께 터치를 얻을, 0

+0

0은 항상 C에서 거짓입니다. 모든 컴퓨팅 환경에서는 거의 사실이 아닙니다. (0이 True 일 수는 있지만 어떤 언어도 생각할 수는 없습니다.) – Chuck

+0

@Chuck : 물론, 0은 "(일종의) 성공"(strcmp()처럼)을 나타내는 경우가 있습니다. 그래서 내가 그런 식으로 썼습니다. – unwind

관련 문제