iPhoneでイベントを使用せずに画面上の現在のタッチの数をクエリする
-
27-09-2019 - |
質問
ユーザーがUiViewに触れて、ユーザーが画面上で指をスライドすると異なるトーンに変更すると、サウンドの再生を開始するアプリケーションがあります。ユーザーが指を上げると音が止まります。
私はTouchesbeganを使用しており、このためにイベントを移動して終了しました。
私の問題は、タッチが終了した(および/またはキャンセルされた)ことが適切に発射されないことがあり、指が画面から持ち上げられた後も音が演奏され続けます。
そのため、回避策として、画面上のタッチの数をチェックするタイマーを実装したいと思います。ゼロの場合は、再生する場合はAudioplayerをチェックして停止します。
私は次のようなタッチの数を得ることができるいくつかのコードを探しています
uitouch *touches = [self getalltouchesonscreen];
か何か :)
解決
タッチエンドイベントが発射されない場合があります。
キャンセルされたタッチのためにブレークポイントを設定しようとしましたが、タッチが終了したイベントをタッチしましたが、時にはヒットしません。
AppleのWebサイトからGLPAINTサンプルプログラムを試してみて、TOCHESのNSLOGを試してみて、画面上でいくつかの高速図面を実行し、指を画面から投げるなど、指を速く持ち上げます。
あなたは私が何を意味するかを知っているでしょう。これに対する私の現在のソリューションには加速度計が含まれます:)
ヒント:これを使用してすべてのイベントを見つけます:( void)sendevent:(uievent *)イベント
他のヒント
NSSet *allTouches = [event allTouches];
for(GLuint index = 0; index < [allTouches count]; ++index)
{
UITouch *touch = [[allTouches allObjects] objectAtIndex:index];
if([touch phase] != UITouchPhaseCancelled)
{
CGPoint touchPoint = [touch locationInView:self];
//do something with touchPoint that has state [touch phase]
}
}
このコードは、すべてのタッチイベント関数(touchesbegan、touchesended、touchmoved)で使用でき、タッチを数えて状態を知ることができます。
TouchScanceledを忘れないでください。この関数/メソッドを追加して、タッチが終了したら、それをnslogにしてください。
タップカウントを探している場合は、指を動かさずに同じ場所で複数回タップしています - 経由で入手できます。
-(void)iPhoneTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
CGPoint touchPosition = [touch locationInView:self];
lastTouchTime = [touch timestamp];
myTouchCount = [touch tapCount];
しかし、TouchMovedを使用して手動で移動し、タップがあまりにも遠くに移動した場合にダブル/トリプルタップする機能をキャンセルし、有効なタップ状態にある限りタップをカウントすることもできます。