0

長押しジェスチャーと継続的な更新用に構成されたステッパーを使用してビューを設定しようとしました。長押しでは、ステッパーの連続機能が発生しません。今のところ、長押しを無効にしています。私はそれを必要としないと思います。しかし、将来の参考のために、どうすれば両方を共存させることができますか?

明確にするために、これを試したときの画面の設定方法を次に示します。

  • アプリはシンプルなView Controllerでセットアップされました。
  • サブビューがこのビューに追加されました (コントローラーである可能性がありますが、UIView にしました)。
  • このサブビューにいくつかのラベルとステッパーが追加されました。
  • ステッパーは、コンセントとアクションとして配線されました。
  • IB のメイン ビューに longpress レコグナイザーが追加されました。
  • 完全を期すために、タップ ジェスチャも IB のメイン ビューに追加されました。

期待どおりにメインビュー機能をタップします。ステッパーのタップは期待どおりに機能します。メイン ビューを長押しすると、期待どおりに機能します。ステッパーの長押しはしません。

サブビューのフレームをチェックし、タッチ位置がその長方形内にある場合は動作しないように、ロングプレスによって呼び出されるコードを変更しましたが、違いはありませんでした。その状況で長押しを失敗させようとはしませんでしたが、次はそれを試してみようと思います。編集:OK、そうではないかもしれません。そのための API はないようです。ただし、このクラッジがあり、私は試しません。

添付されているのはプロファイラーのスクリーン ショットで、呼び出しツリーが逆になっているため、各項目が何によって呼び出されているかがわかります。

darkStepped:ステッパーによって呼び出される IBAction です。ステッパーがジェスチャ レコグナイザーによってトリガーされた場合、コール ツリーにジェスチャ レコグナイザーが表示されるとは思いませんか?

ステッパーを保持することによって呼び出されるセクションを示すステッパーのスクリーン ショット

4

2 に答える 2

1

ステッパーがジェスチャ レコグナイザーによってトリガーされた場合、コール ツリーにジェスチャ レコグナイザーが表示されるとは思いませんか?

スタック トレースは、ステッパーの_updateCountメソッドがタイマーを介してディスパッチされていることを示しています。

これは、ステッパーが「autoIncrement」モードを持っているという事実に関連している可能性があります。このモードでは、押し続けている限り、特定の (変化する) レートで更新されます。そのため、単に を呼び出す代わりに_updateCount、ステッパーはタイマーを設定してこの動作を処理します。

タイマーが使用される理由は何であれ、スタック トレースにジェスチャ レコグナイザーが表示されない理由は、タイマーによって説明されます。

あなたの場合、ステッパーがタッチを取得して処理し、それに接続されているジェスチャ認識機能に転送しないということが起こります。

UIStepperこれは次のように説明できますが、このスニペットでは、コントロールに関連する長押しレコグナイザーについて明示的に言及していません。

Apple Docsによると:

他のユーザー インターフェイス コントロールとの対話 iOS 6.0 以降では、既定のコントロール アクションにより、ジェスチャ認識機能の動作が重複するのを防ぎます。たとえば、ボタンの既定のアクションは 1 回のタップです。ボタンの親ビューにシングル タップ ジェスチャ レコグナイザがアタッチされている場合、ユーザーがボタンをタップすると、ボタンのアクション メソッドがジェスチャ レコグナイザの代わりにタッチ イベントを受け取ります。これは、次のようなコントロールの既定のアクションと重複するジェスチャ認識にのみ適用されます。

UIButton、UISwitch、UIStepper、UISegmentedControl、UIPageControl を 1 本指で 1 回タップします。

...

これらのコントロールのいずれかのカスタム サブクラスがあり、既定のアクションを変更する場合は、ジェスチャ レコグナイザーを親ビューではなくコントロールに直接アタッチします。次に、ジェスチャ レコグナイザは最初にタッチ イベントを受け取ります。いつものように、iOS ヒューマン インターフェイス ガイドラインを必ず読んで、特に標準コントロールの既定の動作をオーバーライドするときに、アプリが直感的なユーザー エクスペリエンスを提供するようにしてください。

したがって、ジェスチャー認識機能をコントロールに直接アタッチできるようです (おそらくUIStepper、これを機能させるにはサブクラス化する必要があります。最後の段落を解釈する方法がよくわかりません)。これにより、ステッパーの基本的な動作が無効にならないことを願っています (ただし、無効になる可能性があります)。

于 2013-12-31T11:00:29.203 に答える
0

Apple のドキュメントを再度注意深く確認したところ、解決策が見つかりました。View Controller をデリゲートとして longpress ジェスチャ認識エンジンに追加しました

self.longPress.delegate = self;

(そしてもちろん、<UIGestureRecognizerDelegate>インターフェースに追加してから、このメソッドをView Controllerに追加しました:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
   // Determine if the touch is inside the custom subview
   if (gestureRecognizer == self.longPress) {
      CGPoint touchLocation = [touch locationInView:self.view];
      if (CGRectContainsPoint(self.antControl.frame, touchLocation)) {
         return NO;
      }
   }
   return YES;
}

self.antControlこのようにして、質問で言及されているサブビューであるのフレーム内で長押しが発生したときに、ジェスチャ認識エンジンが呼び出されることさえありません。

于 2013-12-31T19:04:07.050 に答える