우리는있는 UIButton 길게 누르기와 버튼 누르기를 구분할 수 있습니까?
에있는 UIButton
- 수돗물의 두 개의 다른 이벤트에 대한 응답으로 다른 작업/대표 전화 할 수 있나요?
우리는있는 UIButton 길게 누르기와 버튼 누르기를 구분할 수 있습니까?
에있는 UIButton
예, iPhone OS 3.2 이상에서는 UILongPressGestureRecognizer를 사용하여 구현할 수 있습니다. 길게 누르는 동작은 제스처 인식기에 의해 처리되고 짧은 탭은 버튼의 정상 동작으로 전달됩니다.
- (void)setLongTouchAction:(SEL)newValue
{
if (newValue == NULL)
{
[self removeGestureRecognizer:longPressGestureRecognizer];
[longPressGestureRecognizer release];
longPressGestureRecognizer = nil;
}
else
{
[longPressGestureRecognizer release];
longPressGestureRecognizer = nil;
longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:[[self allTargets] anyObject] action:newValue];
[self addGestureRecognizer:longPressGestureRecognizer];
}
}
내가 다음 설정하려면 다음을 수행 할 수 :
은 (longPressGestureRecognizer
인스턴스 변수입니다) 예를 들어, 내가있는 UIButton을 서브 클래스 및 탭과 함께 갈 길이 터치 동작을 지정하기위한 다음과 같은 방법을 추가 동일한 대상에 의해 처리됩니다 짧은 탭하고 길게 누르면 작업 모두 :
[undoButton addTarget:self action:@selector(performUndo:) forControlEvents:UIControlEventTouchUpInside];
[undoButton setLongTouchAction:@selector(showUndoOptions:)];
, 이것은 당신이 많은 아이 패드 응용 프로그램의 제목 표시 줄에 표시되는 실행 취소 버튼에 유용합니다.
제가 생각할 수있는 가장 좋은 해결책은 다른 클래스를 만들고 UIButton을 서브 클래 싱하는 것입니다. 그런 다음 인터페이스 빌더 (사용중인 경우)에서 단추의 클래스를 방금 작성한 사용자 정의 클래스로 설정할 수 있습니다.
그래서이 새로운 클래스에서, 당신이 기본적으로 누군가가 버튼을 누를 있음을 말하고있다
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
라는 메서드를 재정의해야합니다. 터치는 NSSet이며 화면에서 누르는 모든 손가락에 대한 모든 정보를 보유합니다. 당신은 단지 버튼 자체에 눌러 년대 하나에 관심이 있다면, 당신은 아마 같은 것을해야합니다 : 그래서 지금 당신이 당신의 버튼에 해당하는 접촉을 가지고
NSSet *myTouches = [event touchesForView:self.view];
을, 당신은 얼마나 많은 알아 내야 사용자가 해당 버튼을 탭한 횟수.
NSUInteger numTaps = [[myTouches anyObject] tapCount];
이 숫자가 2이면 사용자가 버튼을 두 번 탭했음을 의미합니다. 이제 다음 부분이 나옵니다. 사용자가 해당 버튼을 누르고 있는지 어떻게 알 수 있습니까? 사용자가 화면을 이동하면 다른 메소드가 호출됩니다. 당신은뿐만 아니라 하나를 재정의해야합니다 :
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
이 사람이 화면을 터치 중지 있는지 알 수있는 곳입니다 또는 그의 손가락이 여전히있는 경우. 그의 손가락이 아직 위에 있으면이 사건은 아직 불려지지 않았다. 배경
와 이제 충분히
는 여기에 내 제안합니다. touchesBegan : 메서드를 재정의하고 버튼의 탭 수가 2인지 확인하는 것이 좋습니다. 그렇다면 필요한 작업을 수행하는 타이머를 시작한 다음 필요에 따라 타이머를 시작한 다음 touchesEnded : 메소드에서 타이머를 멈추고 타이머를 멈추고 사용자가 수행해야하는 한 또는 사용자가 계속 누르고있는 한 수행 한 모든 작업을 수행합니다. 버튼에.
이 코드가 도움이되기를 희망합니다. 코드를 작성하지 않았 으면 실험하고 연구해야하지만 질문이 있으시면 기꺼이 도와 드리겠습니다.)
브래드 라슨 (Brad Larson)의 대답은 꽤 좋아 보이지만, 원하는 바를 더 유연하게 제어 할 수있는 또 다른 방법이 있습니다. 당신은있는 UIButton 하위 클래스
, 당신은 touchesBegan을 무시하고 방법을 touchesEnded 사용자가 터치를 시작할 때 당신이
[self performSelector:@selector(detecetedLongTap) withObject:nil afterDelay:1.0];
를 호출 할 수 있도록하고 touchesEnded 당신은 전화 :
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(detecetedLongTap) object:nil];
이벤트를 취소하려면 손가락이 너무 빨리 들어왔다면.
이 블로그 게시물이에 대한 전체 코드를 얻을 수 있습니다 :
http://www.isignmeout.com/adding-long-tap-functionality-uibutton/
또한 3.2 이전의 iPhone OS 버전을 대상으로하는 경우에만 사용할 수있는 유일한 방법입니다. 그 전에 사용했던 제스처 인식기는 OS에 없었습니다. –
나는적인 Cocos2D 또는 Box2D의 게임에서 longPressGestureRecognizer를 사용할 수 있습니다. 내 게임에서 화면의 터치 지속 시간을 기준으로 플레이어의 점프를 변경해야합니까? 아니면 내 솔루션이 될 수 있습니까? – Nitish