2012-02-19 3 views
2

私はiOS/objective-Cの新人です。カスタムジェスチャーを構築する方法を知りたいと思っていました。特に、ユーザが画面の右上をタップし、指をデバイスの端から下にスライドさせる場合(左手側の同じジェスチャ)。私はこれを読んで:カスタムiOSジェスチャー

https://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizers/GestureRecognizers.html#//apple_ref/doc/uid/TP40009541-CH6-SW2

しかし、私はトラブル私の特定のケースに適用する方法を考え出すを持っていますね。

+0

[self.view addGestureRecognizer:[[RightSlidedown alloc] initWithTarget:self action:@selector(rightSlide:)]]; 

そして、シンプルなアクションメソッドは、すべてのことはそうと同じように、必要なのですか? –

答えて

6

UIGestureRecognizerサブクラスを作成することは、堅実なやりかたで少し関係があります。私は非常にWWDC2010件のビデオを見てみることをお勧めしますSession 120 - Simplifying Touch Event Handling with Gesture Recognizers & Session 121 - Advanced Gesture Recognition彼らは徹底的でよくできています。

あなたの質問に基づいて非常に簡単な例として、ユーザーが添付ビューの左上象限に触れて、添付されたビューの右下の象限に指をスライドさせると発生する非常に簡単なジェスチャ認識器を作成しました添付のビューの左側にスライドすることなく、自分の指を表示してピックアップします。

RightSlidedown.h:

#import <UIKit/UIGestureRecognizerSubclass.h> // This import is essential 
@interface RightSlidedown : UIGestureRecognizer 
@end 

RightSlidedown.m

​​

したがって、基本的ジェスチャー認識は、標準のタッチイベントのように思えるものを取得します。 (彼らはそうではありませんが、彼らはそのように行動します)。動きに応じて、ジェスチャ認識機能のstateプロパティが変更されます。

「Discrete」(タップジェスチャーを考える)と「Continuous」(パンジェスチャーを考える)の2種類の認識機能があります。どちらのタイプも、最初はUIGestureRecognizerStatePossibleで自動的に始まります。

このような「離散」タイプの場合は、できるだけ早くまたはUIGestureRecognizerStateFailedの状態にすることを目標としています。

この例を理想的に使用するには、RightSlidedownジェスチャ認識機能を、ビューコントローラのviewDidLoadの新しい「単一表示アプリケーション」のメインビューに追加することが理想的です。ジェスチャーで何

-(void)rightSlide:(RightSlidedown *)rsd{ 
    NSLog(@"right slide"); 
} 
+0

非常に完全な回答をいただきありがとうございます。私は2つの問題に遭遇しました: 1)私がジェスチャーを行うときはいつでも、私は決して「終了」機能にはしません。あなたが画面全体を指で滑らなければならない時間制限があるのか​​どうか疑問に思っています。 2)私は現在、私の見解では別の長い押しジェスチャ認識装置を持っています(単にハンドラを押したままにします)。これらの2つのジェスチャーを区別するにはどうすればよいですか? – user1120008

+0

私は私の答えを少し編集しました。また、1)このジェスチャ認識装置は時間制限を課さない。レコーダーが失敗した場合は、 'touchesEnded:'には到達できません(長押しで認識できない可能性があります)。 2)ジェスチャ認識者は、関連する行動方法を呼び出すことによって、自分自身を区別する。 – NJones

+0

さて、私はtouchesEndedに関して私が持っていた問題を特定した。テーブルビューの上にこのスライディングジェスチャーを使用したいと思います。通常のビューでは正常に動作しますが、テーブルビューの上では正しく実行されません。 – user1120008

1

タッチのx軸とy軸の正または負のデルタのいずれかを表示することで実行できます。チェックマークジェスチャー(√)は、負のデルタに続いてyの正のデルタになりますが、xと負のデルタが常にあり、タッチが開始された場所よりも低い高さで終了します。より多くの小切手を追加する指を追加します。

擬似コード:

bool firstStroke, secondStroke, motion, override; 
while (touchdown){ 
if (yDelta < 0){firstStroke = TRUE;} 
if (firstStroke && yDelta > 0){secondStroke = TRUE;} 
if (xDelta < 0){motion = TRUE;} 
if (xDelta > 0 || (firstStroke && secondStroke && yDelta < 0)){override = TRUE;} 
} 
if (firstStroke && secondStroke && motion && start.y > end.y && !override){ 
    return TRUE; 
}else{ 
    return FALSE; 
} 

whileコマンドは、タッチがダウンしている間、3つの事を確認することを意味しますタッチ-if

は、タッチした後

-Ifを下に移動した持っています

- タッチが右から左に移動している場合

第4のチェックは、タッチが左から右に動いたかどうか、またはジェスチャーが終了した後にジェスチャーが動かされた後であるかどうかを調べることです。

タッチが終了したら、ジェスチャが正しく移動したかどうか、ポイントが正しい場所で開始および終了したかどうか、ジェスチャが不適切な動作(上書き)で移動したかどうかを確認するチェックがもう1度あります。

希望に役立ちます。

関連する問題