10

そのようなビュー階層があります

UIScrollView
 |
 +- UIView
     |
     +- UITextField
     +- UITextField
     +- UIButton

私が欲しいのは、テキストフィールドの1つをタップして画面上のキーボードを見たユーザーが、UIViewの「空のスペース」をタップしてキーボードを非表示にできるようにすることです。したがって、たとえば、UIButton からのイベントが UIView にバブルアップすることは望ましくありません (UIView に UITapGestureRecognizer を追加すると、まさにそれが起こります)。

目的の機能を実現するにはどうすればよいですか?

4

4 に答える 4

23

viewDidLoadメソッドに、このジェスチャ認識機能を追加します。

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
gestureRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:gestureRecognizer];

次にdismissKeyboardメソッドを追加します。

- (void) dismissKeyboard{
   [YOURFIELDHERE resignFirstResponder];
} 

これを追加して、ボタンがまだクリック可能で、ジェスチャ認識エンジンによってオーバーライドされないようにする必要もあります。

gestureRecognizer.delegate = self; // in viewDidLoad
<UIGestureRecognizerDelegate> //in your header file

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {

  if ([touch.view isKindOfClass:[UIButton class]]){
    return NO;
  }
  return YES; // handle the touch
}
于 2012-06-19T13:06:42.590 に答える
1

私はこの同じ問題に遭遇し、単純な解決策で解決します。

  1. View を UIView のインスタンスから UIControl のインスタンスに変更して、タッチ イベントを処理できるようにします。
  2. タッチ イベントを処理するビュー コントローラーで IBAction メソッドを作成します。この場合、ビューのサブビューからファーストレスポンダーを辞任させます。

    - (IBAction)backgroundTapped:(id)sender { [contentView endEditing:YES]; }

    contentView は、ビューを指す単なるインスタンス変数です。任意の名前を付けることができます。メッセージendEditingをビューに渡すと、基本的にそのサブビューにファーストレスポンダーを辞任するように指示し、キーボードを閉じます。

  3. Interface Builder を介してターゲット (ビュー) とアクション (先ほど作成した IBAction メソッド) を接続しconnection inspector、ビューの を開き、それを選択Touch Up Insideしてファイルの所有者オブジェクトにドラッグし、メソッドの名前を選択します。

うまくいけば、それは役に立ちます。

于 2012-11-19T15:33:15.467 に答える
1

少し遅れていることは承知していますが、迅速で簡単な解決策は次のとおりです。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    [self.view endEditing:YES];
}

空きスペースをタップすると呼び出されます。

于 2013-09-10T22:32:52.317 に答える