2012-04-03 12 views
1

内のすべてのタッチを認識する。私は関係なく、触れたものを、インターフェイスですべてのタッチを認識しないことができるようにしたいインターフェース

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

..しかし、ユーザーがタップに反応しないもの(例えばuiimages)

私はこの能力を必要とする理由にタップしたときにこれはただの認識:

私が試してみましたユーザーが5分間画面に触れないとスライドショーを開始したいので、タッチするたびにタイマーをリセットする必要があります。このリセットコードを各UIイベントに個別に入れるのは間違っているようです。

答えて

3

を、しかし、言ったよう@omz - それは最高の一つですsendEvent:をオーバーライド。

@interface YourWindow : UIWindow { 
    NSDate timeOfLastTouch; 
} 
@end 

@implementation YourWindow 
- (void)sendEvent:(UIEvent *)event { 
    [super sendEvent:event]; 

    NSSet *touches = [event allTouches]; 
     UITouch *touch = [touches anyObject]; 
    if(touch.phase == UITouchPhaseEnded){ 
     timeOfLastTouch = [NSDate date]; 
    } 
} 



@end 

UIWindowをYourWindowに置き換えることを忘れないでください。

3

あなたはUIWindowをサブクラス化し、sendEvent:メソッドをオーバーライドすることができます。

1

あなたがUIWindowをサブクラス化し、このようなsendEvent:メソッドオーバーライドすることができますいくつかの可能な解決策がある

- (void)sendEvent:(UIEvent *)event { 
    if (event.type == UIEventTypeTouches) { 
    // You got a touch, do whatever you like 
    }; 

    [super sendEvent:event]; // Let the window do the propagation of the event 
} 
+0

私はちょうど...私は同じ時間に鉱山を入力してあなたの答えを見@omz申し訳ありません:P – Alladinian

+0

あなたはアプリデリゲートの代わりに一つの標準UIWindow *ウィンドウに意味ですか?以来、私はこれがViewControllerごとにこれを行う方が良いように見えるアプリのすべての部分でこれをトリガしたくないので..それを行う方法はありますか? – cannyboy

+1

私が知る限り、これを別々のUIViewControllerに実装するのは難しいです。その理由は、任意のイベント(タッチを含む)に対する最初の応答者が「UIApplication」であるためです。その後、イベントはUIWindowに伝播され、イベントを処理するビュー(UIResponderサブクラス)を検索しようとします。だからあなたがすべてのタッチイベントをキャッチしたいのであれば、最善のアプローチは 'UIWindow'(または' UIApplication')のサブクラスを作成することです。 – Alladinian

1

あなたは、タップ方式

であなたのタイマーのコードを実行するこの

UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapMethod)]; 
tapped.delegate=self; 
tapped.numberOfTapsRequired = 1; 
[self.view addGestureRecognizer:tapped]; 

を追加するのviewDidLoadでUIGestureRecognizerDelegateその後、

@interface ViewController : UIViewController <UIGestureRecognizerDelegate> { 

を追加するには、インターフェイスでタップジェスチャー

を使用することができます

-(void)tapped { 
//timer code 
} 
@Alladinianコメントの一つに述べたよう

はあなたのUI要素がsetUserInteractionEnabled:YES

1

を持っていることを確認し、iOSのリファレンスドキュメントはのUIApplicationのサブクラスを作成すると、右のアプリケーションであるため、サブクラス化UIWindowに好適と思われることを言及しています。 cf. https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIApplication_Class/Reference/Reference.html:または sendAction:

あなたはのSendEventを上書きするのUIApplicationのサブクラスを作成することを決定する可能性があるに:から:forEvent:カスタムイベントとアクション ディスパッチを実装します。

+0

これは正解です!アプリケーションのサブクラス化については、次を確認することもできます:http://stackoverflow.com/questions/1399202/how-to-subclass-uiapplication – Alex

関連する問題