5

ボタンを押し続けた結果、一連のイベントを起動する必要があることがよくあります。フィールドをインクリメントするボタンを考えてみ+てください。タップすると 1 ずつインクリメントされますが、タップ アンド ホールドは、ボタンが離されるまで毎秒 1 ずつインクリメントする必要があります。もう 1 つの例は、オーディオ プレーヤー タイプのアプリで戻るボタンまたは進むボタンを押したときのスクラブ機能です。

私は通常、次の戦略に頼っています。

  1. 希望の間隔で繰り返しタイマーtouchDownInsideを設定しました。
  2. OntouchUpInsideタイマーを無効にして解放します。

しかし、そのようなボタンごとに、個別のタイマー インスタンス変数、2 つのターゲット アクション、および 2 つのメソッドの実装が必要です。(これは、私が汎用クラスを作成していて、同時タッチの最大数に制限を課したくないと仮定しています)。

私が見逃しているこれを解決するためのよりエレガントな方法はありますか?

4

2 に答える 2

2

次の方法で、すべてのボタンのイベントを登録します。

[button addTarget:self action:@selector(touchDown:withEvent:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(touchUpInside:withEvent:) forControlEvents:UIControlEventTouchUpInside];

ボタンごとに、tag属性を設定します。

button.tag = 1; // 2, 3, 4 ... etc

ハンドラーで、必要なことをすべて実行します。タグでボタンを識別します。

- (IBAction) touchDown:(Button *)button withEvent:(UIEvent *) event
{
     NSLog("%d", button.tag);
}
于 2012-11-06T10:53:54.487 に答える
2

私は提案しUILongPressGestureRecognizerます。

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(addOpenInService:)];
    longPress.delegate      =   self;
    longPress.minimumPressDuration = 0.7;
    [aView addGestureRecognizer:longPress];
    [longPress release];
    longPress = nil;

イベントを発生させると、呼び出しを受けることができます

- (void) addOpenInService: (UILongPressGestureRecognizer *) objRecognizer
{
    // Do Something
}

同様にUITapGestureRecognizer、ユーザーのタップを認識するために使用できます。

お役に立てれば。:)

于 2012-11-06T12:31:44.127 に答える