質問

UiscrollviewのサブビューであるUitextfieldがあります。これは、最初の応答者になるUitextfieldの一部として、単一のタップジェスチャー(またはおそらく古いタッチ)が存在しています。 uitextfieldにダブルタップジェスチャーを追加したかったのです。 2つのジェスチャーの相互に排他的なものを作るために、私は過負荷にする必要がありました(ただし、これは同じ名前を使用していないため、これは正しい言葉ではありません)。私がそれを行うとき、それが呼び出す関数がuitextfieldを最初の応答者にしない限り、それは正常に動作します。それがテキストフィールドを最初の応答者にする場合、それは2度目の故障に失敗します.... wtf。スタック、少しの助けが大いに役立つでしょう。

これは私がジェスチャーを追加する場所です

 UITapGestureRecognizer * singleTextTap = [[UITapGestureRecognizer alloc] 
             initWithTarget:self action:@selector(handleSingleTextTap:)];         
 singleTextTap.numberOfTapsRequired = 1;
 [aTextField addGestureRecognizer:singleTextTap];

そして、これはそれが呼ばれる場所です

//single tap text
- (void) handleSingleTextTap:(UITapGestureRecognizer *)gestureRecognizer{
    NSLog(@"handling single tap");
    NSLog(@"textField gestures %@", 
          [gestureRecognizer.view.gestureRecognizers descriptionWithLocale:nil]);
    [(UITextField *)gestureRecognizer.view becomeFirstResponder];
}

テキストフィールドに登録されているジェスチャーを配置するnslogに気付くかもしれません。これは初めて「終了」され、次の時間はこのコードに到達することはありません

役に立ちましたか?

解決

あなたが見ている行動は、あなたが送るたびに becomeFirstResponder aへのメッセージ UITextField それは自分のジェスチャー認識者を設定します。 [Textfield GestureRecognizers]をオンにしてログオンを行うと、それらの多くがセットアップされていることがわかります。これらは、カーソルの動きなどのLong Pressなどのテキスト編集機能を扱うことです。これらを追加することで、セットアップがあるものをキャンセルします。これに対処する最も簡単な方法は、このようなことです。

- (void) singleTap:(UITapGestureRecognizer*)singleTap {
    if (![self.textField isFirstResponder]) {
        [self.textField becomeFirstResponder];
        self.label.text = @"Single Tap -> Make First Responder";
        [self.label setNeedsDisplay];
    }
}
- (void) doubleTap:(UITapGestureRecognizer*)doubleTap {
    if (![self.textField isFirstResponder]) {
        [self.textField becomeFirstResponder];
        self.label.text = @"Double Tap -> Make First Responder";
        [self.label setNeedsDisplay];
    }
}

- (void) setupTextGestureRecognizers {
    for (UIGestureRecognizer *rec in self.textField.gestureRecognizers) {
        [self.textField removeGestureRecognizer:rec];
    }
    UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)] autorelease];
    UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)] autorelease];
    [singleTap setNumberOfTapsRequired:1];
    [doubleTap setNumberOfTapsRequired:2];
    [singleTap setCancelsTouchesInView:YES];
    [doubleTap setCancelsTouchesInView:YES];
    [singleTap requireGestureRecognizerToFail:doubleTap];
    [self.textField addGestureRecognizer:singleTap];
    [self.textField addGestureRecognizer:doubleTap];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupTextGestureRecognizers];
    self.textField.delegate = self;
}


- (BOOL) textFieldShouldReturn:(UITextField *)tf {
    [tf resignFirstResponder];
    if (tf == self.textField) {
        [self setupTextGestureRecognizers];
    }
    return YES;
}

これが次のとおりです 例プロジェクト 使用中のこのコードを実証します。

他のヒント

あなたがしていることは本当に奇妙に思えますが、何でも。あなたが何をしているのか知っていると思います。

以下を試すことができます。

UITapGestureRecognizer *doubleTap = ...;
UITapGestureRecognizer *singleTap = ...;
[singleTap requireGestureRecognizerToFail:doubleTap];

これは、単一のタップ認識器が発射しない場合にのみ発射され、効果的に相互に排他的になることを意味します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top