2012-05-11 1 views
0

나는 각 UIView의 drawRect : 메서드를 통해 그려진 복잡한 모양을 가진 여러 UIView가 있습니다. 경로 (CGPath 속성을 통해)에 대한 참조를 저장하고 터치가 경로 또는 모양 (CGPathContainsPoint) 내에 실제로 있는지 여부를 감지하기 위해 터치 방법에서이를 사용하고 있습니다. 모양 때문에 투명한 뷰 영역 (사각형/직사각형이 아닌 것은 분명히 뷰의 backgroundColor 속성이 clearColor 또는 일부로 설정된 경우)이 투명 영역을 갖습니다.UITouch가 바인딩 된보기를 결정할 수 있습니까?

보기의 맨 위나 겹침이 발생하는 상황 (흔히 발생)에 대해서는 터치 방법 (touchesBegan 등)을 테스트하여 터치가 실제로 CGPath 또는 모양 내에 있는지 확인합니다. 터치가 도형 내에 있지 않으면 터치를 그 다음 뷰로 이동하여 차례대로 해당 요구 사항을 통과하는지 봅니다.

슬프게도 (당황 스럽지만) 실제로는보기에 바인딩되는 것과 같은 행동을하지 않습니다. 나는 특히이 문제를 제외한 모든면에서이 문제를 해결했다. 각 뷰는 UIRotationGestureRecognizer를 사용하고 있습니다. 그러나 터치가 다른 뷰의 투명한 영역에서 시작된 경우 해당 뷰가 그 뷰를 그 아래 뷰에 전달하면 UIGestureRecognizer는 결코 트리거되지 않습니다.

나는 내가 아는 모든 각도에서 이것을 보았다. 나는 실제적으로 적절한 뷰에 터치를 재 할당하거나 바인딩하는 몇 가지 방법을 생각하려고 시도했지만 이것이 가능할 지 모르겠습니다. 뷰가 다른 뷰로 터치를 전달하는 동안 터치는 먼저 터치를받은 원래 뷰에 바인딩 된 상태로 유지됩니다.

UIApplication 또는 UIWindow를 서브 클래 싱하고 sendEvent : "메서드를 재정 의하여이 방법을 사용할 수 있을지 궁금합니다. 애플이이 컨트롤에서 제공 할 수있는 컨트롤이 정확히 무엇인지 모르겠다. 비공개 API에 액세스 할 수 있습니다. 터치가 속한 것으로 생각할 수 있도록 터치를 재 지정할 수있는 방법이 필요합니다.

아이디어가 있습니까?

답변

2

당신은 UIView의 하위 클래스. 중 하위 클래스 UIView의 또는 서브 클래스 UIGestureRecognizer에 의해

서브 클래스 UIView의

을 이렇게 (또는 그 서브 클래스의)와 최우선

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 

당신은 어떤 점을 결정할 수 있었다 보기 내부에있는 것으로 간주됩니다. 경로 밖에있는 점은 단순히 반환합니다. NO

서브 클래스 UIGestureRecognizer 하위 클래스 UIGestureRecognizer

을 (또는 그 서브 클래스의)와

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

는 제스처 인식기가 인식해야 감동을 결정할 수 최우선. 당신은 전화 (하지만 서브 클래스되지 않음)해야 경로 이외의 모든 접촉 자신에

- (void)ignoreTouch:(UITouch *)touch forEvent:(UIEvent *)event 

하십시오.


경로 안의 점?

어느 경우 에나 당신이 말한 경로 안에 포인트가 있는지 알아야합니다. 경로가 이미 UIBezierPath들로 저장하는 경우

당신은 단순히 베 지어 패스에

- (BOOL)containsPoint:(CGPoint)point 

를 호출 할 수 있습니다. 점 또는 터치가보기에

- (CGPoint)convertPoint:(CGPoint)point toView:(UIView *)view 

또는

- (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view 

를 호출하여 경로와 같은 뷰의 좌표로 변환해야 할 수 있습니다. 경로가 CGPath로 저장되어있는 경우이 완전히 질문에 대답하지 않았지만

당신이

[UIBezierPath bezierPathWithCGPath:CGPath]; 
+0

를 사용하여 그것에서 UIBezierPath를 만들 수 있습니다, 그것은 바른 길에 나를 넣어. 그것을 좀 더 살펴보면서 나는이 블로그 게시가 질문에 완전히 대답 한 것을 발견했다 : http://bynomial.com/blog/?p=74 나는 그것이 좋은 노력 이었기 때문에 대답을 받아 들였고, 내가 알아야했다. – daveMac

+0

내가 명확히 할 수 있는게 있나요? –

+0

각 뷰는 touches 메서드 (touchesBegan, moved 등)를 오버라이드하여 터치를 "가로 채고"있었으므로 - (BOOL) pointInside : (CGPoint) point withEvent : (UIEvent *) 이벤트가 호출되지 않았습니다. 전망. 그러나 위에 제공된 링크를 따라 기본 서브 뷰의 hitTest : 메서드를 재정의 한 다음 pointInside :를 사용하여 올바른 터치인지 여부를 결정할 수있었습니다. 또한, 당신이 "경로 안의 포인트"를 잘 알고 있다고 확신하는 동안? 섹션에서, 내가 이미 이것을하고 있다고 진술 했으므로 그것은 무의미했습니다. 그래도 다시 고마워. – daveMac