2011-01-23 2 views
3

UIScrollView의 하위보기 인 UITextField가 있습니다. 첫 번째 응답자가되는 UITextField의 일부로 단일 탭 제스처 (또는 이전 터치)가 있습니다. UITextField에 두 번 탭 제스처를 추가하려고했습니다. 두 제스처를 상호 배타적으로 만들기 위해 과부하가 필요했습니다 (동일한 이름을 사용하지 않았으므로이 단어는 맞지 않지만). 단일 탭 제스처. 내가 할 때 그것을 호출하는 함수가 첫 번째 응답자 UITextField 만들지 않는 한 그것은 잘 작동합니다. 텍스트 필드를 첫 번째 응답자로 만들면 두 번째로 실패합니다 .... wtf. 그래서 스택, 조금 도움이 먼 길을 갈 것입니다. 나는 제스처를IOS에서 알 수없는 이유로 UIGesture가 실패 함

UITapGestureRecognizer * singleTextTap = [[UITapGestureRecognizer alloc] 
      initWithTarget:self action:@selector(handleSingleTextTap:)];   
singleTextTap.numberOfTapsRequired = 1; 
[aTextField addGestureRecognizer:singleTextTap]; 

를 추가 할 경우

이며,이 그것이 당신이 밖으로이 확인했다 텍스트 필드에 등록 된 gestuers을두고 NSLog를 알 수 있습니다

//single tap text 
- (void) handleSingleTextTap:(UITapGestureRecognizer *)gestureRecognizer{ 
    NSLog(@"handling single tap"); 
    NSLog(@"textField gestures %@", 
      [gestureRecognizer.view.gestureRecognizers descriptionWithLocale:nil]); 
    [(UITextField *)gestureRecognizer.view becomeFirstResponder]; 
} 

라고있는 곳입니다 내 singleTextTap 제스처의 상태. 이 코드는 처음에는 '종료'되고 다음 번에는이 코드에 도달하지 않습니다

답변

2

표시되는 동작은 becomeFirstResponder 메시지를 UITextField으로 보낼 때마다 발생하는 것으로, 자신의 제스처 인식기를 설정합니다. [textField gestureRecognizers]에 로그온하면 많은 것들이 설정됩니다. 커서 이동 등의 길게 누르기와 같은 텍스트 편집 기능을 처리합니다. 이것들을 추가하는 것으로 설정 한 것을 취소합니다. 가장 쉬운 방법은 이와 같습니다.

- (void) singleTap:(UITapGestureRecognizer*)singleTap { 
    if (![self.textField isFirstResponder]) { 
     [self.textField becomeFirstResponder]; 
     self.label.text = @"Single Tap -> Make First Responder"; 
     [self.label setNeedsDisplay]; 
    } 
} 
- (void) doubleTap:(UITapGestureRecognizer*)doubleTap { 
    if (![self.textField isFirstResponder]) { 
     [self.textField becomeFirstResponder]; 
     self.label.text = @"Double Tap -> Make First Responder"; 
     [self.label setNeedsDisplay]; 
    } 
} 

- (void) setupTextGestureRecognizers { 
    for (UIGestureRecognizer *rec in self.textField.gestureRecognizers) { 
     [self.textField removeGestureRecognizer:rec]; 
    } 
    UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)] autorelease]; 
    UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)] autorelease]; 
    [singleTap setNumberOfTapsRequired:1]; 
    [doubleTap setNumberOfTapsRequired:2]; 
    [singleTap setCancelsTouchesInView:YES]; 
    [doubleTap setCancelsTouchesInView:YES]; 
    [singleTap requireGestureRecognizerToFail:doubleTap]; 
    [self.textField addGestureRecognizer:singleTap]; 
    [self.textField addGestureRecognizer:doubleTap]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [self setupTextGestureRecognizers]; 
    self.textField.delegate = self; 
} 


- (BOOL) textFieldShouldReturn:(UITextField *)tf { 
    [tf resignFirstResponder]; 
    if (tf == self.textField) { 
     [self setupTextGestureRecognizers]; 
    } 
    return YES; 
} 

여기에이 코드가 사용 중임을 나타내는 example project이 있습니다.

+1

이 대답을 통해 내 문제를 해결하는 데 필요한 단서를 얻을 수있었습니다. 텍스트 필드 하위보기를 탭할 때 무시 된보기에 대한 탭 인식기가 있습니다. 텍스트 필드의 모든'gestureRecognizers'를 일시적으로 비활성화함으로써 내가 부작용없이 찾고있는 행동을 얻었습니다. – phatmann

1

당신이하고있는 일은 정말 이상하게 보입니다. 네가하는 일을 내가 알고 있다고 가정 할 것이다.

는 다음을 시도 할 수 있습니다 :

UITapGestureRecognizer *doubleTap = ...; 
UITapGestureRecognizer *singleTap = ...; 
[singleTap requireGestureRecognizerToFail:doubleTap]; 

이것은 단일 탭 인식기는 화재 더블 탭이 하나가 효과적으로 상호 배타적하고, 발생하지 않는 것인지 것을 의미한다.