ユーザーがキーボード以外の場所をタップしたときにiPhoneキーボードを閉じることができるようにしたい。どうすればこれを行うことができますか?レスポンダーを閉じる必要があることは知っていますが、ユーザーがキーボードスペースをタップしたときにレスポンダーを実装する方法を知る必要があります。
UITapGestureRecogniser
を追加してビューに割り当てる必要があり、それからセレクタのテキストフィールドでresign first responderを呼び出します。
コード:
viewDidLoad
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
dismissKeyboard:
-(void)dismissKeyboard {
[aTextField resignFirstResponder];
}
(aTextFieldはキーボードを担当するテキストフィールドです)
オプション2
GestureRecognizerを追加する余裕がない場合は、これを試すことができます
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch * touch = [touches anyObject];
if(touch.phase == UITouchPhaseBegan) {
[aTextField resignFirstResponder];
}
}
私が使用した最も簡単なソリューションはこれです:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
EndEditingコマンドは、サブフィールドとしてテキストフィールドを含む任意のビューで使用できます。この方法の他の利点は、どのテキストフィールドがキーボードをトリガーしたかを知る必要がないことです。したがって、複数のテキストフィールドがある場合でも、この行をスーパービューに追加してください。
Appleドキュメンテーションに基づいて、このメソッドはこの問題を解決するために特別に存在すると思います。
TapGesture Recognizerを追加しますが、cancelsTouchesInView = NOを確認してください
UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(closeTextInput)];
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];
[tapGesture release];
UITapGestureRecogniserを追加してビューに割り当てる必要があります。その後、セレクターのテキストフィールドで最初のレスポンダーの辞任を呼び出します。
コード:
ViewDidLoadで
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
DismissKeyboardで:
-(void)dismissKeyboard {
[self.view endEditing:true];
}
キーボードを閉じるには、キーボードの下にサブビューとして透明なUIVIewを追加し、そこでタッチを処理する必要があります。以下のコードは参考用です。
UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(overlayTouched:)];
gesture.delegate = self;
[(UITapGestureRecognizer *)gesture setNumberOfTouchesRequired:1];
UIView* trans = [[UIView alloc] initWithFrame:[[delegate view] bounds]];
[trans setOpaque:NO];
[trans setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin];
[trans setAlpha:0.3];
[trans setUserInteractionEnabled:YES];
trans.multipleTouchEnabled = YES;
[trans addGestureRecognizer:gesture];
[trans setBackgroundColor:[UIColor blackColor]];
[trans setTag:BLACK_SCREEN_VIEW];
これはSwift 4ソリューションです:
let tap = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard))
self.view.addGestureRecognizer(tap)
そして、dismissKeyboard
@objc func dismissKeyboard() {
self.view.endEditing(true)
}
ジェスチャーレコグナイザーを追加したくない場合は、touchesBeginメソッドも使用できます。
コード入力Swift 4
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { view.endEditing(true) }
UITableViewController
を使用している場合、またはユーザーが対話するUITableView
を持っている場合、ViewDidLoadで簡単に実行できます。
tableView.KeyboardDismissMode = UIScrollViewKeyboardDismissMode.OnDrag;
注:これはXamarin.iOSの構文です。
他の方法は簡単です:
UIView as UIControl in custom class in the interface builder
を作成し、Touch up inside event
のUIView : UIControl
にIBAction
メソッドをアタッチして、[yourTextField resignFirstResponder]
内にIBAction method
を挿入できます。この:
- (IBAction) hideKeyboard: (id) sender
{
// If you have more than one textfield to dismiss, of course only can be active 1, but here you can't know who is it, because sender will be the UIView : UIControl
[alias resignFirstResponder];
[password resignFirstResponder];
}
次に、他のオプションがあり、インターフェイスビルダーにテキストフィールドthe return key of the keyboard as Done
(必要なものはどれでもかまいませんが、Doneはこれに適しています。リターンはフォームでアクションを実行することを意味するため) 、[Done
を押してキーボードを非表示にすることができますが、その場合は、以前のIBActionメソッドをDid end on exit
イベントにアタッチする必要があります。
このようにして、キーボードはキーボードからtouching outside
を非表示にするか、Done
に触れます。
コードを改善したい場合、キーボードからDone
に触れているキーボードのみを非表示にする場合、メソッドは次のようになります。
// Attach all textFields here on Did end on exit event, will not work if touch outside the keyboard
- (IBAction) hideKeyboard: (id) sender
{
[sender resignFirstResponder];
}