2017-08-05 4 views
0

簡潔にするため、特定のロングプレスジェスチャがトリガされるたびにログを記録したいと仮定しますが、ジェスチャが対象とする可能性のあるすべてのセレクタにログコードを入れたくありません。コードを特定のジェスチャーのサブクラスの1か所に配置したいので、開始状態になるとログコードが実行されます。どこでもジェスチャー用のカスタムコードが使用されていますか?

ジェスチャーのサブクラスでこれについてどうやって行くのですか?

ジェスチャのinitWithTargetメソッドをオーバーライドし、NSInvocationオブジェクトに指定されたターゲット/アクションを保存し、ターゲット/アクションをログコードに置き換え、ログコードで格納されたNSInvocationオブジェクトを呼び出す方法がわかりましたそれが行われたとき。ミッドインサイド技術の一種。私はこの実装を本当に好きではない、それはかなりハッキリのようだ。

編集:これは、長押しのジェスチャーです。私はUIGestureRecognizerSubclass.hを知りませんでしたが、今では、ジェスチャーが認識される前にtouchesBeganトリガーを行います。ジェスチャーが認識されていることを特に監視するにはどうすればよいですか? setStateをオーバーライドすると動作するようですが、認識された状態を待つことは、アクションがトリガーされるまでトリガーしません。

+0

ちょうどサブクラスを作ります。 – Roecrew

+0

シングルトンファイルにロギングコードを入れて、それをサブクラスのそれぞれの 'touchesBegan'メソッドで使用するのはどうですか?こうすることで、ロギングコードが1つのオブジェクトに含まれ、常にそのコードを呼び出すことになります。 – adev

+0

@adevこれは長いプレゼンテーションのためのものであることを明確にすべきだった。 touchesBeganトリガだけでなく、認識されているジェスチャを探す必要があります。 touchesBeganを使用してこれをテストすると、すばやくタップすると、アクションがトリガーされることなくログに記録されます。 –

答えて

0

私はこの質問をしたときに2つの部分が私には分かっていませんでした。

  1. 読み込みUIGestureRecognizerSubclass.hを読み込むと、読み取りのみでなく読み書きが優先されます。

  2. touchesBeganは、UIGestureRecognizerSubclassをインポートした後にのみオーバーライドすることもできますが、これはタッチそのものです。ジェスチャー自体が状態に入るのを見る適切な方法は、状態のセッターを無効にすることです。

回答:UIGestureRecognizerSubclassをインポートし、状態のセッターをオーバーライドします。これを行うことで、ジェスチャー呼び出しがターゲットセレクター上にある前に、独自のコードを実行することができます。

例:

#import <UIKit/UIGestureRecognizerSubclass.h> 

-(void)setState:(UIGestureRecognizerState)state 
{ 
    if (state == UIGestureRecognizerStateBegan) 
    { 
     analyticsForStealthViewRevealElement(self); 
    } 
    else 
    { 
     // Do nothing 
    } 

    [super setState:state]; 
} 
関連する問題