1

TouchesBegan オーバーロードで最初に設定した NSTimer を使用して、タップ アンド ホールド ハンドラーを実装しました。

しかし、私が実際に望んでいるのは、タッチが保持されている間、アクションが連射で連続して実行されることです。そのため、タイマーの期限が切れると、ハンドラーを呼び出して作業を行います。これにより、別のタイマーが設定され、TouchesEnded が入ってキャンセルされるか、別の終了条件が満たされるまで、サイクルが続きます。

これは、ハンドラー コードが同時にアニメーションをトリガーするまでは正常に機能します。これで、アニメーション イベントとタイマー イベントがオフになり、TouchesEnded も処理する必要があります。

私が見つけたのは、アニメーションがトリガーされ、タイマーを0.025秒未満に設定した場合、タイマーサイクルが停止するまでTouchesEndedイベントが発生しないことです(他の終了条件)。より遅いタイマーを設定するか、アニメーションをトリガーしないと、動作します (TouchedEnded がすぐに表示されます) が、私が望むものではありません。

明らかに、これはすべてデバイス上にあります (リリース ビルド - NSLogs なし) - sim ではすべて正常に動作します

これらのイベントの相対的な優先度を設定する方法はありますか?それとも、ここで明らかな何かが欠けている可能性がありますか?

[アップデート]

この例では、完了するまで視覚的なフィードバックなしで継続的な部分を実行することで、これを回避しました (このユーザーの観点からすると、これは瞬時です)。今のところこれでいいと思います。私はまだこれについてもっと考えを聞きたいと思っています (Jeffrey のアイデアは良かったです) が、今はテンターフックを待っているわけではありません.

4

1 に答える 1

1

スレッドにスポーンして、独自のタイマータイプのクラスを作成してみてください。例:

BOOL continue = YES; //outside of your @implementation

-(void)doLoop
{
   while(continue){
      [NSThread sleepForTimeInterval:.025];
      [self performSelectorOnMainThread:@selector(whateverTheFunctionIs) waitUntilDone:YES];
    }
}

これはによって開始され[NSThread detatchNewThreadSelector:@selector(doLoop) toTarget:self withObject:nil]ます。これは完全にスレッドセーフではありませんが、ブール値をNSNumberにラップし、必要に応じて@synchronizeを実行することを選択できます。あるいは、その小さなスニペットを書いた後、sleepForTimeIntervalの代わりに現在のNSTimeに対してチェックを行う方がよいことに気付きました:しかし、あなたは要点を理解しています。:)

于 2008-10-31T21:32:57.167 に答える