2011-09-29 19 views
0

私は、プログラムのタッチ状態を追跡する変数touchStatusを持っています。変数はtouchesBeganメソッドではB、touchesEndedではE、touchesMovedではMに設定されます。遅延タッチレスポンス

ただし、私の要件は少し異なります。私は、画面から持ち上げる指とタッチ状態がEにセットされるまでに1秒の遅れがあるようにプログラムするように要求されました。 1秒が経過する前にユーザーが画面に触れた場合、touchStatusはMまたはB(1秒前にあったもの)のままで続ける必要があります。

どうすればこの問題を解決できますか?

答えて

1
あなたが使用することができます

[self performSelector:@selector(setEndedValue:) withObject:self afterDelay:1.0]; 

値は以下のような設定すべきかどうかを監視するためのBOOL作成します。値が設定される前に画面が再度タッチすると

BOOL hasTouchRestarted = NO; 

を、値をYESに変更してsetEndedValueメソッドから戻ります。

-(void)setEndedValue { 
    if (hasTouchRestarted) { return; } 
    // set value 
    self.touchStatus = E; 
} 
+0

Aah!本当にありがとう。それはとても簡単でした。以下に示唆されている人々のように、私はタイマーを使用しようとしていましたが、それはあまりにも多くのコードでした。とにかく、 'performSelector:withObject:afterDelay'はチャームのように機能します。私はこれを前に考えていたはずです! – Ravi

+0

確かに!タイマーはひどく薄れていて、正しく無効化しないと、同時に複数回実行することができます。 PerformSelectorはそれをすべて処理します。 – seejaneworkit

0

touchEndedルーチンでは、NSTimerタスクを設定して1秒でセレクターを呼び出します。その前にもう一度タッチがある場合は、タイマータスクをキャンセルします。

0

遅延コールを開始するにはNSTimer *タイマーivarを使用し、1秒前に指を離すとコールをキャンセルします。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    self.myvar = @"B"; 
    [self.timer invalidate]; 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleOneSecondPress) userInfo:nil repeats:NO]; 
} 
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent*)event { 
    [self.timer invalidate]; 
    self.timer = nil; 
} 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    self.myvar = @"M"; 
} 
- (void)handleOneSecondPress { 
    self.timer = nil; 
    self.myvar = @"E"; 
}