2010-12-16 27 views

答えて

16

はい、UILongPressGestureRecognizer(iPhone OS 3.2以降)を使用してこれを実装するのは簡単です。長い押しはジェスチャ認識装置によって処理され、短いタップはボタンの通常の動作に渡されます。

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

が、これはあなたが多くのiPadアプリケーションのタイトルバーに表示アンドゥボタンに便利です。

+0

私はCocos2DまたはBOX2DゲームでlongPressGestureRecognizerを使用することができます。私のゲームでは、画面上のタッチの持続時間に基づいてプレーヤーのジャンプを変える必要がありますか?それとも、私の解決策に他にはありますか? – Nitish

4

私が考えることができる最高の解決策は、別のクラスを作成し、UIButtonをサブクラス化することです。その後Interface Builder(使用している場合)で、ボタンのクラスを今作成したカスタムクラスに設定できます。

だから、この新しいクラスでは、あなたがこれは基本的に誰かがあなたのボタンを押していることを伝えるている

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

と呼ばれるメソッドをオーバーライドする必要があります。タッチはNSSetであり、画面上のすべての指の情報を保持します。あなただけのボタン自体に押すのOneに興味があるなら、あなたはおそらくのようなものがあるでしょう。だから今、あなたのボタンに対応してタッチを持っていることを

NSSet *myTouches = [event touchesForView:self.view]; 

を、あなたはどのように多くを見つけるために持っていますユーザーがそのボタンをタップした回数。

NSUInteger numTaps = [[myTouches anyObject] tapCount]; 

この番号が2の場合、ユーザーがボタンを2回タップしたことを意味します。今度は次の部分になります。ユーザーがそのボタンを押しているかどうかをどのように知っていますか?ユーザーが画面を離れると、別のメソッドが呼び出されます。あなたにも1つを無効にする必要があります:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 

人が画面をタッチ停止した場合や、彼の指がそれに残っている場合は、あなたが知っている場所です。彼の指がまだそれにあれば、このイベントはまだ呼び出されていません。

背景と今十分

は、ここに私の提案です。私はtouchesBegan:メソッドをオーバーライドし、ボタンのタップ数が2であるかどうかを確認することをお勧めします。そうであれば、実行する必要がある限り、必要な処理を行うタイマーを起動してからtouchesEnded:メソッドでは、先に進み、タイマーを停止します。このようにして、実行する必要がある限り、またはユーザーが保持している限りボタンに移動します。

私はこれが役立つことを願っています。明らかに私はあなたのためにコード全体を書きませんでした。あなたはそのことを実験して研究しなければなりませんが、質問があれば喜んで手伝ってください。 )

8

ブラッド・ラーソンの答えはかなり良いようですが、ここではもう少し柔軟性があり/あなたがやりたいことをコントロールできるかもしれません。あなたは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には存在しませんでした。 –

関連する問題