UITap 제스처 인식기 - 단일 탭 및 이중 탭
2개를 추가하려고 합니다.UITapGestureRecognizers
단일 탭 및 이중 탭 이벤트에 대해 하나씩 표시됩니다.단일 탭 인식기가 예상대로 작동합니다(자체적으로).그런데 더블 탭 인식기가 작동이 안 되는 것 같습니다.
다음과 같은 특성으로 실험을 시도했습니다.cancelsTouchesInView
,delaysTouchesBegan
그리고.delaysTouchesEnded
하지만 여전히 작동하지 않습니다.
더블 탭을 하면 싱글 탭 인식기가 항상 활성화되고 더블 탭 이벤트도 슈퍼 뷰로 전송됩니다.하지만 커스텀 더블 탭 인식기는 전혀 통보되지 않는 것 같습니다.
문서는 위에서 언급한 세 가지 속성을 사용할 수 있음을 시사하는 것으로 보입니다.그러나 어떤 값을 설정해야 하는지, 어떤 인식자(싱글, 더블 또는 둘 다)에 대해 설정해야 하는지 잘 모르겠습니다.이것에 정통한 누군가가 도움이 되길 바랍니다.
다음은 최신 업데이트된 코드 블록입니다.
// ****** gesture recognizers ******
- (void)addSingleAndDoubleTapGestureRecognizersToView:(UIView *)view
{
// single tap
UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector(handleSingleTapOnView:)];
[singleTapRecognizer setNumberOfTouchesRequired:1];
[view addGestureRecognizer: singleTapRecognizer];
// double tap
UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector (handleDoubleTapOnView:)];
[doubleTapRecognizer setNumberOfTouchesRequired:2];
[singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer];
[view addGestureRecognizer: doubleTapRecognizer];
}
- (void)handleSingleTapOnView:(id)sender
{
}
- (void)handleDoubleTapOnView:(id)sender
{
}
UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doSingleTap)] autorelease];
singleTap.numberOfTapsRequired = 1;
[self.view addGestureRecognizer:singleTap];
UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doDoubleTap)] autorelease];
doubleTap.numberOfTapsRequired = 2;
[self.view addGestureRecognizer:doubleTap];
[singleTap requireGestureRecognizerToFail:doubleTap];
참고: 사용 중인 경우 numberOfTouchesRequired
그래야 한다. .numberOfTouchesRequired = 1;
스위프트를 위하여
let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didPressPartButton))
singleTapGesture.numberOfTapsRequired = 1
view.addGestureRecognizer(singleTapGesture)
let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(didDoubleTap))
doubleTapGesture.numberOfTapsRequired = 2
view.addGestureRecognizer(doubleTapGesture)
singleTapGesture.require(toFail: doubleTapGesture)
Swift 3 솔루션:
let singleTap = UITapGestureRecognizer(target: self, action:#selector(self.singleTapAction(_:)))
singleTap.numberOfTapsRequired = 1
view.addGestureRecognizer(singleTap)
let doubleTap = UITapGestureRecognizer(target: self, action:#selector(self.doubleTapAction(_:)))
doubleTap.numberOfTapsRequired = 2
view.addGestureRecognizer(doubleTap)
singleTap.require(toFail: doubleTap)
singleTap.require(toFail: doubleTap) 코드 라인에서 우리는 단일 탭이 이중 탭이 아닌지 확인하기 위해 기다리도록 강제하고 있습니다.
requireGestureRecognizerToFail: 메서드를 사용해야 합니다.이와 같은 것:
[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];
//--두 번 및 한 번 탭 제스처를 할당해야 하는 경우---------/
UITapGestureRecognizer* doubleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleDoubleTap:)];
UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleSingleTap:)];
[singleTap requireGestureRecognizerToFail : doubleTap];
[doubleTap setDelaysTouchesBegan : YES];
[singleTap setDelaysTouchesBegan : YES];
//------------------------------------------- 탭 수
[doubleTap setNumberOfTapsRequired : 2];
[singleTap setNumberOfTapsRequired : 1];
보기 또는 단추에 더블 탭 및 싱글 탭 제스처 추가--------//
[self.view addGestureRecognizer : doubleTap];
[self.view addGestureRecognizer : singleTap];
그게 정확히 당신이 찾고 있는 것인지는 모르겠지만, 저는 제스처 인식기 없이 싱글/더블 탭을 했습니다.UITableView에서 사용하고 있기 때문에 didSelectRowAt에서 해당 코드를 사용했습니다.IndexPath 메서드
tapCount++;
switch (tapCount)
{
case 1: //single tap
[self performSelector:@selector(singleTap:) withObject: indexPath afterDelay: 0.2];
break;
case 2: //double tap
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(singleTap:) object:indexPath];
[self performSelector:@selector(doubleTap:) withObject: indexPath];
break;
default:
break;
}
if (tapCount>2) tapCount=0;
방법은 NSIndexPath를 매개 변수로 사용할 경우 singleTap 및 doubleTap을 사용할 수 없습니다.
- (void)singleTap:(NSIndexPath *)indexPath {
//do your stuff for a single tap
}
- (void)doubleTap:(NSIndexPath *)indexPath {
//do your stuff for a double tap
}
도움이 되길 바랍니다.
Swift 2용 솔루션:
let singleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleSingleTap))
singleTapGesture.numberOfTapsRequired = 1 // Optional for single tap
view.addGestureRecognizer(singleTapGesture)
let doubleTapGesture = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap))
doubleTapGesture.numberOfTapsRequired = 2
view.addGestureRecognizer(doubleTapGesture)
singleTapGesture.requireGestureRecognizerToFail(doubleTapGesture)
저는 UIGesture RecognizerDelegate 메서드를 구현하여 singleTap과 doubleTap을 모두 탐지했습니다.
그냥 이렇게 해요.
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTapGesture:)];
[doubleTap setDelegate:self];
doubleTap.numberOfTapsRequired = 2;
[self.headerView addGestureRecognizer:doubleTap];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTapGesture:)];
singleTap.numberOfTapsRequired = 1;
[singleTap setDelegate:self];
[doubleTap setDelaysTouchesBegan:YES];
[singleTap setDelaysTouchesBegan:YES];
[singleTap requireGestureRecognizerToFail:doubleTap];
[self.headerView addGestureRecognizer:singleTap];
그런 다음 이러한 대리 방법을 구현합니다.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
일부 보기에는 자체 더블 탭 인식기가 내장되어 있습니다.MKMapView
예를 들어).이 문제를 해결하려면 다음을 구현해야 합니다.UIGestureRecognizerDelegate
방법shouldRecognizeSimultaneouslyWithGestureRecognizer
그리고 돌아옴YES
:
먼저 이중 및 단일 인식기를 구현합니다.
// setup gesture recognizers
UITapGestureRecognizer* singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(mapViewTapped:)];
singleTapRecognizer.delegate = self;
singleTapRecognizer.numberOfTapsRequired = 1;
UITapGestureRecognizer* doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(mapViewDoubleTapped:)];
doubleTapRecognizer.delegate = self; // this allows
doubleTapRecognizer.numberOfTapsRequired = 2;
[singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];
그런 다음 다음을 구현:
#pragma mark UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer
*)otherGestureRecognizer { return YES; }
@stanley의 논평과 관련하여 -
탭 제스처를 사용하여 작업할 선택 행을 지정하지 않음UITableView
이미 완전한 탭 처리 기능을 갖추고 있기 때문에...
그러나 단일 탭 제스처 인식기에서 '보기에서 터치 취소'를 '아니오'로 설정해야 합니다. 그렇지 않으면 탭 이벤트가 표시되지 않습니다.
언급URL : https://stackoverflow.com/questions/8876202/uitapgesturerecognizer-single-tap-and-double-tap
'programing' 카테고리의 다른 글
Excel에서 SQL 문을 생성하기 위한 트릭 (0) | 2023.07.20 |
---|---|
오라클 스크립트에서 테이블 이름에 변수를 사용하는 방법 (0) | 2023.07.20 |
SQL에서 문자열의 문자를 바꾸는 방법은 무엇입니까? (0) | 2023.07.20 |
ValueError : 닫힌 파일의 I/O 작업 (0) | 2023.07.20 |
ODP.NET을 사용하여 이름별로 쿼리 매개 변수 바인딩 (0) | 2023.07.20 |