2009-12-30 6 views
0

서브 클래스가있는 UIImageView가있는 UIScrollView가 있습니다. imageviews 중 하나를 클릭 할 때, 나는에서 이벤트를 수신하기 위해 부모의 UIView를합니다 (있는 ScrollView를 포함)하고 싶은 그부모가 자녀의 터치에 응답합니다.

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

이미지 뷰가

if(CGRectContainsPoint(myScrollView.frame, location) == YES){...} 

이 가정에 의해 클릭 된 경우 내가 말할 수있는 이미지 뷰와 스크롤 뷰는 같은 ​​크기입니다. 또는 scrollview 내에서 특정 이미지 뷰를 알 수있는 더 나은 방법이 있습니까? 이미지 뷰는 동적으로 생성됩니다.

+3

"최고의 타이틀을위한 upvote"버튼은 어디에 있습니까? –

답변

2

하는 것으로를 (또는 그들에 통과 할 수 있습니다 superview). 이미지 뷰 'userInteractionEnabled 속성을 YES로 설정하십시오.

0

이미지보기에 자식이없는 경우 UIView 메서드 hitTest:withEvent:을 사용할 수 있습니다. 주어진 터치 포인트를 포함하는 UIView의 가장 먼 자손을 반환합니다. 그래서 예를 들면 :

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    CGPoint location = [[touches anyObject] locationInView:myScrollView]; 
    UIView *touchedView = [myScrollView hitTest:location withEvent:event]; 
    // ... 
}
+0

어디에서 끝났습니까? 부모 UIView 내부 UIImageView 도청 될 때 결코 발생합니다. scrollview 또는 uiview가 누를 경우 실행됩니다. – 4thSpace

+0

4thSpace : 그렇다면 touchesEnded : withEvent :'에서 터치 이벤트를 '[self superview]'로 전달하도록 UIImageView의 하위 인스턴스를 서브 클래 싱하여 수정할 수 있습니다. (사용자 상호 작용을 사용하지 않도록 설정하는 것이 좋지만'hitTest : withEvent :'도 깨뜨릴 수 있습니다.) – Tim

+0

감사합니다. 나는 UIImageViews가 서브 클래 싱 된 것을 반영하기 위해 OP를 업데이트했다. 당신의 생각은 합리적이지만 touchesEnded : withEvent는 서브 클래 싱 된 UIImageViews에서 실행되지 않습니다. – 4thSpace

3

내가 과거에이 사용되는 서브 뷰가 접촉되었을 때 알림에 게시 된 객체와 하위 뷰와 알림을 해고하는 한 접근 방식. 그런 다음 컨테이너보기에서 적절한 알림을 수신하고 선택한 UIView 인스턴스를 기반으로 필요한 모든 작업을 수행 할 수 있습니다. 다음과 같이

당신은 서브 뷰의 -touchesEnded:withEvent: 방법 내에서 알림을 게시 할 것 :

[[NSNotificationCenter defaultCenter] postNotificationName:@"MySubviewWasTouched" object:self]; 

당신은 같은 코드를 삽입 할 것,이 알림을 수신 설정하려면보기 또는 뷰의 초기화 어딘가에 다음 컨트롤러 :

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleSubviewTouch:) name:@"MySubviewWasTouched" object:nil]; 

뷰 또는 컨트롤러의 분해 코드에서 관찰자를 제거한 것을 기억하십시오.

마지막으로, 당신은 (위의 예에서 -handleSubviewTouch:) 통지의 수신을 처리하는 방법을 구현해야 할 것 : 오히려 UIImageView이 접촉을 무시

- (void)handleSubviewTouch:(NSNotification *)note; 
{ 
    UIView *subviewThatWasTouched = [note object]; 

    // Your touch-handling logic here 
} 
+0

이것은 의미가 있으며 나는 서브 클래 싱 된 UIImageViews에 touchesEnded를 추가했지만 실행되지는 않습니다. 나는 UIImageViews가 하위 클래스라고 언급하지 않았지만 OP를 업데이트했습니다. 하위 클래스에 대한 추가 작업이 필요한지 확실하지 않습니다. 나는 생각하지 않는다. – 4thSpace

+0

노아가 UIImageViews 및 터치 처리에서 자주 발생하는 userInteractionEnabled 속성을 지적했습니다. –

관련 문제