2010-12-16 6 views

답변

16

예, 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:)]; 

, 이것은 당신이 많은 아이 패드 응용 프로그램의 제목 표시 줄에 표시되는 실행 취소 버튼에 유용합니다.

+0

나는적인 Cocos2D 또는 Box2D의 게임에서 longPressGestureRecognizer를 사용할 수 있습니다. 내 게임에서 화면의 터치 지속 시간을 기준으로 플레이어의 점프를 변경해야합니까? 아니면 내 솔루션이 될 수 있습니까? – Nitish

4

제가 생각할 수있는 가장 좋은 해결책은 다른 클래스를 만들고 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 : 메소드에서 타이머를 멈추고 타이머를 멈추고 사용자가 수행해야하는 한 또는 사용자가 계속 누르고있는 한 수행 한 모든 작업을 수행합니다. 버튼에.

이 코드가 도움이되기를 희망합니다. 코드를 작성하지 않았 으면 실험하고 연구해야하지만 질문이 있으시면 기꺼이 도와 드리겠습니다.)

8

브래드 라슨 (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/

+0

또한 3.2 이전의 iPhone OS 버전을 대상으로하는 경우에만 사용할 수있는 유일한 방법입니다. 그 전에 사용했던 제스처 인식기는 OS에 없었습니다. –

관련 문제