2011-09-12 12 views
1

私はビューの基本的なUITextFieldと「送信」ボタンがあります。ユーザーがUITextFieldをタップすると、キーボードが表示されます。私はビューをシフトして、有用なビットがキーボードによってブロックされないようにし、キーボードが消えたときに、再びキーボードの表示/非表示の通知に登録されたものを元に戻します。UITapGestureRecognizerのタップロケーションの悩み

ユーザーは、キーボードの溝を開けるために、ビュー内のどこでもタップすることができます。だから、私はUITapGestureRecognizerを追加し、テキストフィールドにresignFirstResponderを呼び出します。作品はすごく....ほとんど。

[送信]ボタンをタップすると機能しません。 cancelsTouchesInViewではなく、私はそれをNOに設定しました。それは動く景色です。ポストシフトダウンビューに「タップ」が登録されます。したがって、ビューを80ポイント下にスライドさせると、ユーザーが「ボタン上に」作成したタップが、ボタンの上の80ポイントになります。

したがって、ジェスチャーレコグナイザイベントが発生してビューが移動する前に、そのタップを通過させるにはどうすればよいですか?

答えて

3

私のために最適な修正が見つかりました。

UIGestureRecognizerDelegateには、– gestureRecognizer:shouldReceiveTouch:というメソッドがあり、ジェスチャ認識ツールがタッチを受け入れるべきかどうかを選択できます。本質的には

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
     if ([touch.view isKindOfClass:[UIControl class]]) 
      return NO; 
     return YES; 
    } 

タップはUicontrolオブジェクトのサブクラスであるものに起こった場合、そのオブジェクトは、クリックを処理しましょう、そうでない場合は、私のジェスチャー認識は、それを取得します。

1

ビューがボタンのように機能するようにするには、UIControlのように機能し、UIViewのサブクラスであるため、ユーザーがビューをタップしてキーボードを閉じ、キーボードを閉じたときにtouchUpInsideイベントを追加できますユーザーが送信ボタンをタップすると、そのトリックを行う必要があります。これがうまくいくと思っています

1

私は多くのアプリで同じ機能を使用しています。 GestureRecognizerを使用するのではなく、UIViewではなく、UIControlとして表示を設定しました。 UIViewでやっていることをやりなおすことはできますが、ビューとやり取りするときに実行するIBActionsを割り当てることもできます。

これを行う方法は次のとおりです。Interface Builderで、あなたのビューを選択します。次に、そのクラスをUIControlに割り当てます。 (おそらく現在UIViewとして設定されています)

そのビューのViewControllerには、backgroundActionメソッドを記述してbackgroundTapsを検出します。鉱山は、次のようになります。

- (IBAction)backgroundTap:(id)sender 
{ 
    if ([textField1 isEditing]) { 
     [textField1 resignFirstResponder]; 
    } else if ([textField2 isEditing]) { 
     [textField2 resignFirstResponder]; 
    } 
} 

最後に、Interface Builderで、UIControlに作成したIBActionを接続します。

+0

これは非常にエレガントな解決策です。私の唯一の懸念は、UIControl以外のオブジェクトにタップを登録するだけなので、必要な場合もあります(別のコントロールをタップすると自動的に現在のコントロール、つまりUITextFieldでアクティブになります)。私はそれを試してみるよ – DBD

+0

それはうまくいったが、ページ上にいくつかのサブビューがあり(多くのダイナミックな)、すべてをアクションに設定するのは面倒だ。私はUser Interaction Enabled = NOに設定できましたが、他のコントロールにはオプションがありません。したがって、これは素晴らしい答えですが、この場合はうまくいかないでしょう。 – DBD

関連する問題