1

나는 pan, rotate, pinch에 UIGestureRecognizer을 사용하고 있습니다. 하지만 전 관점에서 적용하고 있습니다. 하위보기 이외의 단추에 대한 제스처를 제거해야합니다. 하지만 팬에 영향을주는 버튼을 사용할 때도 마찬가지입니다. self.view에서 버튼 이동을 제한하는 방법. UIPanGestureRecognizer 코드를 아래에 사용했습니다.UIButton에 대한 제스처 제거

UIPanGestureRecognizer *dbpan = [[UIPanGestureRecognizer alloc] initWithTarget:self 
                     action:@selector(ondbPan:)]; 

[self.view addGestureRecognizer:dbpan]; 

[closeButton removeGestureRecognizer:dbpan]; 

팬 : 그 서브 뷰 클래스있는 UIButton 클래스의 종류 인 경우

- (void)ondbPan:(UIPanGestureRecognizer *)gesture 
{ 
    if ((gesture.state == UIGestureRecognizerStateChanged) || 
     (gesture.state == UIGestureRecognizerStateEnded)) { 


     CGPoint offset = [gesture translationInView:self.view]; 

     CGPoint center = gesture.view.center; 
     center.x += offset.x; 
     center.y += offset.y; 
     gesture.view.center = center; 

     [gesture setTranslation:CGPointZero inView:self.view]; 

    } 
} 

답변

4

은 노호 코드 FALSE UIGestureRecognizer 수익의 위임을보십시오. 또한 설정하는 동안 대리자 dbpan.delegate = self;을 설정하고 UIPanGestureRecognizer을 추가하십시오.

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
     if ([touch.view isKindOfClass:[UIButton class]]) 
     { 
      return FALSE; 
     } 
     else 
     { 

     return TRUE; 
     } 
} 

UPDATE : -

내가 왜 내가이이 코드를 사용하여뿐만 아니라 하나의 데모를 만들어 테스트하려면 끝에서 작동하지 잘 모릅니다 : -

.H 파일을

@interface myviewcontroller : UIViewController<UIGestureRecognizerDelegate> 

및 .m 클래스

- (void)pan:(UIPanGestureRecognizer *)gesture 
{ 
    if ((gesture.state == UIGestureRecognizerStateChanged) || 
     (gesture.state == UIGestureRecognizerStateEnded)) { 

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

     [demoView setCenter:location]; 
    } 
} 

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if ([touch.view isKindOfClass:[UIButton class]]) 
    { 
     return FALSE; 
    } 
    else 
    { 

     return TRUE; 
    } 
} 

- (void)viewDidLoad 
{ 


    UIPanGestureRecognizer *dbpan = [[UIPanGestureRecognizer alloc] initWithTarget:self 
                      action:@selector(pan:)]; 
    dbpan.delegate=self; 
    [self.view addGestureRecognizer:dbpan]; 
    [super viewDidLoad]; 
} 

-(IBAction)B1called 
{ 

    NSLog(@"This is called button 1"); 

} 
-(IBAction)B2called 
{ 
    NSLog(@"This is called button 2"); 

} 

그리고 출력이

enter image description here

+0

작동하지 않습니다 ... 같은 오류 – user3496826

+0

내 업데이트 된 답변 확인 –

+0

그것은 나를 위해 작동하지 않습니다. Pan에 대한 업데이트 된 코드를 확인할 수 있습니까? – user3496826

0

이 시도이다의 ... 스위프트에

while (closeButton.gestureRecognizers.count) { 
    [closeButton removeGestureRecognizer:[closeButton.gestureRecognizers objectAtIndex:0]]; 
} 
0

:

FUNC gestureRecognizer (gestureRecognizer : UIGestureRecognizer, shouldReceiveTouch 터치 : UITouch) -> BOOL {

if (touch.view!.isKindOfClass(UIButton)) { 
    return false 
} 
return true 
} 

참고 : UIGestureRecognizerDelegate가 추가되어 있는지 확인하고있는 viewDidLoad에 tapGesture.delegate이 = 자기()를 확인합니다.

관련 문제