2014-05-22 3 views
0

UIViewViewController 두 개가 UITapGestureRecognizer으로 추가되었습니다. 그들의 프레임은 충돌 상태에 있습니다. (이해를 쉽게하기 위해 같음). UIView을 클릭하면 마지막으로 하위 뷰로 추가 된 뷰가 아닌 두 뷰의 인식 자 함수가 트리거됩니다. 그것을 할 방법이 있습니까?서브 뷰 아래의 하위보기는 제스처 인식기 기능을 호출하지 않습니다.

UIView *a = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)]; 
UITapGestureRecognizer *aa = 
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDeviceClick:)]; 
[a addGestureRecognizer:aa]; 
[self.view addSubview:a]; 
UIView *b = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 50, 50)]; 
UITapGestureRecognizer *bb = 
[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDeviceClick:)]; 
[b addGestureRecognizer:bb]; 
[self.view addSubview:b]; 

그리고 기능 : UIViews 및 제스처 만들기위한

코드

-(void)handleDeviceClick:(UITapGestureRecognizer*)recognizer{ 
    NSLog(@"device click occured"); 
} 

UIGestureRecognizerDelegate

을 시도해보십시오 내 헤더 파일

답변

0

에 추가됩니다이 :

// second view is called 
// handleDeviceClick1: action of second view 
// handleDeviceClick0: action of first view 

-(void)handleDeviceClick1:(UITapGestureRecognizer*)recognizer{ 
    // call first view 
    [self handleDeviceClick0:recognizer] 
} 
+0

내 실제 문제는 내가 2 개뿐만 아니라 여러 개의보기를 가지고 있으며 숫자가 고정 숫자가 아니므로 알려진 수의 탭 제스처 기능을 만들 수 있다는 것입니다.하나의 함수 만 만들고 클릭 된 뷰와 충돌 한 모든 하위 뷰에 대해 여러 번 호출해야합니다. – AleksandarNS

+0

원하는 항목 : 마지막보기가 클릭되고 나머지보기가 마지막보기 아래에 몇 가지 속성이 설정됩니까? NSArray는 모든 뷰에 속성을 설정해야한다고 생각합니다. 마지막보기가 꼭지점 일 때, 당신은 foreach 모든 전망 및 재산을 놓았다. 괜찮습니까? – nmh

+0

ViewController에서 여러 개의 사각형을 만들었습니다. 사각형 뒤에있는 직사각형을 클릭하면 그 두 개만 일부 속성 값을 변경하기를 원합니다. 뷰 컨트롤러의 모든 사각형이 아닙니다. 모든 뷰는 변경 가능한 배열에 저장됩니다. – AleksandarNS

0

은 그럼 왜 하나는, 당신은이 UITapGestures을 만들 필요가 없습니다 클릭 한 지점이 subViews


각각의 내부에있는 경우 그냥 확인해야

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

를 사용하지 않는 한 가지 방법 만 사용하기를 원하면 충분합니다.

헤더 파일에 UIGestureRecognizerDelegate도 추가 했습니까?

@interface ViewController <UIGestureRecognizerDelegate> 
+1

헤더 파일에 대리자를 추가했습니다. 메소드가 트리거되지만 뷰 B에 대해서만 트리거되고 A가 먼저 추가되지는 않습니다. – AleksandarNS

0

당신은 당신의 제스처 recognisers에 대한 NOcancelsTouchesInView을 설정해야합니다, 그렇지 않으면 터치를 감지하는 최초의 인식기는 그 일에서 두 번째를 방지 할 수 있습니다 :

aa.cancelsTouchesInView = NO; 
bb.cancelsTouchesInView = NO; 

을 (실제로 일을, 당신은 단지 필요 이것은 최상위 하위 뷰와 연결된 제스처 인식기에 대한 것이지만 뷰 계층 구조가 변경 될 수 있으므로 두 가지 모두에서 수행하는 것이 좋습니다.

docs는 그것을 읽어

cancelsTouchesInView 제스처가 인식 될 때 터치가 도면에 제공되는지 여부에 영향

부울 값. BOOL cancelsTouchesInView

@property (세분화)

토론

이 속성은 (디폴트) YES이고, 상기 수신기는 제스처 뷰에 전달되지 않은 보류되는 제스처의 접촉을 인식

이전에 전달 된 터치는 touchesCancelled : withEvent : 메시지를 통해 취소됩니다. 제스처 인식기가 제스처를 인식하지 못하거나이 속성 값이 NO 인 경우 멀티 터치 시퀀스에서 모든 뷰를 수신합니다.