回答:
を追加UITapGestureRecogniser
してビューに割り当てる必要があります。次に、UITextField
セレクターのresign firstレスポンダを呼び出します。
コード:
viewDidLoad
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
dismissKeyboardの場合:
-(void)dismissKeyboard
{
[aTextField resignFirstResponder];
}
(aTextField
キーボードを担当するテキストフィールドはどこですか)
Swift 3バージョンはそのように見えます
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
self.view.addGestureRecognizer(tapGesture)
dismissKeyboardの場合
func dismissKeyboard (_ sender: UITapGestureRecognizer) {
aTextField.resignFirstResponder()
}
[aTextField resignFirstResponder]
だろう[self.view endEditing:YES];
、それがテキストフィールドへの参照を必要としない、複数のテキストフィールドのために動作します
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
の回答に従って追加しました。テーブルが行の選択に応答しないという問題がありました。5年後、私はこれが誰かを助けることを望みます。
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
私はいくつかの答えをつぶしました。
中に初期化されるivarを使用する viewDidLoad:
UIGestureRecognizer *tapper;
- (void)viewDidLoad
{
[super viewDidLoad];
tapper = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapper];
}
現在編集しているものを閉じます。
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
これを確認してください。これが最も簡単な方法です。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];// this will do the trick
}
または
このライブラリは、スクロールバーの自動スクロール、スペースをタップしてキーボードを非表示にするなどを処理します...
このUITapGestureRecognizer
方法を使用して問題が発生している人がいます。既存のボタンのタップ動作をそのままにしてこの機能を実現する最も簡単な方法は、@ Jensen2kの回答に1行だけ追加することです。
[tap setCancelsTouchesInView:NO];
これにより、既存のボタンが@Dmitry Sitnikovのメソッドを使用しなくても機能するようになりました。
それについてproperty
ここで読んでください(を検索CancelsTouchesInView
):UIGestureRecognizerクラスリファレンス
スクロールバーでどのように機能するかはわかりません。問題があったようですが、他の誰かが私と同じシナリオに遭遇するかもしれません。
UIImageView
、追加[imageView setUserInteractionEnabled:NO];
して「クリックスルー」すると、このメソッドが機能します。
(インターフェイスビルダーで)のUIView
インスタンスを作成し、UIControl
そのTouchUpInside
イベントをdismissKeyboard
メソッドに接続することをお勧めします。このIBAction
メソッドは次のようになります。
- (IBAction)dismissKeyboard:(id)sender {
[aTextBox resignFirstResponder];
}
UITapGestureRecognizer
ビュー内のボタンのタップを妨げる)。レスポンダーチェーンに混乱touchesEnded
があったため機能しませんでしたUIScrollView
。)
スウィフト4
UIViewController
この拡張メソッドを使って一度セットアップしてくださいviewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
self.setupHideKeyboardOnTap()
}
をタップしてもキーボードは表示されなくなりNavigationBar
ます。
import UIKit
extension UIViewController {
/// Call this once to dismiss open keyboards by tapping anywhere in the view controller
func setupHideKeyboardOnTap() {
self.view.addGestureRecognizer(self.endEditingRecognizer())
self.navigationController?.navigationBar.addGestureRecognizer(self.endEditingRecognizer())
}
/// Dismisses the keyboard from self.view
private func endEditingRecognizer() -> UIGestureRecognizer {
let tap = UITapGestureRecognizer(target: self.view, action: #selector(self.view.endEditing(_:)))
tap.cancelsTouchesInView = false
return tap
}
}
SWIFTのバージョンは、これは(のような他の要素との組み合わせで動作しUIButton
、または別UITextField
):
override func viewDidLoad() {
super.viewDidLoad()
let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
tapper.cancelsTouchesInView = false
view.addGestureRecognizer(tapper)
}
self
はなくself.view
canclesTouchesInView
使用するのに便利なプロパティです。ありがとう。
c#
。参考:セミコロンは構文で許可されていますが、必要ありません。
これはどうですか:私はこれが古い記事であることを知っています。それは誰かを助けるかもしれません:)
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
NSArray *subviews = [self.view subviews];
for (id objects in subviews) {
if ([objects isKindOfClass:[UITextField class]]) {
UITextField *theTextField = objects;
if ([objects isFirstResponder]) {
[theTextField resignFirstResponder];
}
}
}
}
これは良い一般的なソリューションです:
Objective-C:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
迅速:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
@icodebusterソリューションに基づく:https ://stackoverflow.com/a/18756253/417652
Swift 4ワンライナー
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
これを行う最も簡単な(そして最良の)方法は、グローバルビューをサブクラス化し、hitTest:withEvent
メソッドを使用してタッチに耳を傾けることだと思います。キーボードのタッチは登録されていないため、hitTest:withEventは、タッチ/スクロール/スワイプ/ピンチ...どこか他の場所でタッチしてを呼び出したときにのみ呼び出されます[self endEditing:YES]
。
ビューの上部にあるボタンをクリックしても呼び出されないtouchesBegan
ため、これは使用するよりも優れtouchesBegan
ています。UITapGestureRecognizer
たとえば、スクロールジェスチャーを認識できない場合よりも優れています。また、複雑で動的なユーザーインターフェイスでは、どこにも薄暗い画面を配置できないため、薄暗い画面を使用するよりも優れています。さらに、他のアクションをブロックすることはありません。外側のボタンを選択するために2回タップする必要はありません(の場合のようにUIPopover
)。
また、を呼び出すよりも優れ[textField resignFirstResponder]
ています。画面に多くのテキストフィールドがあるため、これはすべてのテキストフィールドで機能します。
これは、外をタッチしてキーボードを非表示にする最も簡単な方法です。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
ビューがaに埋め込まれている場合はUIScrollView
、以下を使用できます。
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
前者はテーブルビューがスクロールされるときにキーボードを画面外にアニメーション化し、後者は標準のメッセージアプリのようにキーボードを非表示にします。
これらはiOS 7.0以降で利用できます。
これは、XCode 6以降のストーリーボードを使用して行うことができます。
これを、ViewControllerが使用するクラスのヘッダーファイルに追加します。
@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>
- (IBAction)dissmissKeyboardOnTap:(id)sender;
@end
次に、これを同じViewControllerの実装ファイルに追加します。
- (IBAction)dissmissKeyboardOnTap:(id)sender{
[[self view]endEditing:YES];
}
これは、ストーリーボードシーン(つまりViewController)の「受信アクション」の1つになります。
次に、このアクションをキーボードをタッチするユーザージェスチャーに接続する必要があります。
重要-ストーリーボードに含まれている「UIView」をUIControlに変換して、イベントを受信できるようにする必要があります。ビューコントローラーシーン階層からビューを選択します。
...そしてそのクラスを変更します:
次に、シーンの「受信したアクション」の横にある小さな円からシーンの「空の」部分にドラッグします(実際には、「受信したアクション」をUIControlにドラッグしています)。アクションをフックすることができるイベントの選択が表示されます:
「内側を修正」オプションを選択します。これで、作成したIBActionを、キーボードをタッチするユーザーアクションにフックしました。ユーザーがキーボードをタップすると、非表示になります。
(注:アクションをイベントにフックするために、受信したアクションからビューコントローラー階層のUIControlに直接ドラッグすることもできます。階層では「コントロール」として表示されます。)
私があなたを正しく理解しtextfield
たなら、あなたはoutSideをタップしてキーボードを辞任したいのですが、あなたのの参照がありませんtextfield
。
これを試して;
reftextField
次に、textFieldDidBeginEditing
参照されるテキストフィールドを
- (void) textFieldDidBeginEditing:(UITextField *)textField{
reftextField = textField;
}
今、あなたはどんなボタン時計でも楽しく使うことができます(編集を始めるときに透明なボタンを追加することをお勧めします)
- (void)dismissKeyboard {
[reftextField resignFirstResponder];
}
または、完了ボタンを辞任するには、これを試してください。
//for resigning on done button
- (BOOL) textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
ここにリストに追加するために、外部タッチでキーボードを閉じる方法の私のバージョン。
viewDidLoad:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];
どこでも:
-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
[textFieldName resignFirstResponder];
puts("Dismissed the keyboard");
}
UITapGestureRecognizer
--break UITextField
のクリア(X)ボタンを使用することについて、ここにたくさんの素晴らしい答えがあります。解決策は、デリゲートを介してジェスチャー認識機能を抑制することです。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
BOOL touchViewIsButton = [touch.view isKindOfClass:[UIButton class]];
BOOL touchSuperviewIsTextField = [[touch.view superview] isKindOfClass:[UITextField class]];
return !(touchViewIsButton && touchSuperviewIsTextField);
}
これは最も堅牢なソリューションではありませんが、私にとってはうまくいきます。
return !touchViewIsButton
。キーボードを非表示にする必要がある他のボタンは、アクションでそれを行う必要があると思います。さらに、キーボードを閉じるときにレイアウトが変更されると、TouchUpInsideが呼び出されない場合があります。
次のように、UiViewのカテゴリを作成し、touchesBegan meathodをオーバーライドできます。
それは私にとってはうまく機能しています。そして、それはこの問題の中央解決策です。
#import "UIView+Keyboard.h"
@implementation UIView(Keyboard)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.window endEditing:true];
[super touchesBegan:touches withEvent:event];
}
@end
@ Jensen2kの回答のSwiftバージョン:
let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)
func dismissKeyboard() {
aTextField.resignFirstResponder()
}
一発ギャグ
self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))
私は新しい開発にバリーの例を使用しました。うまくいきました!しかし、私は少し変更を加える必要があり、編集されているテキストフィールドに対してのみキーボードを閉じる必要がありました。
それで、私はバリーの例に以下を追加しました:
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
_textBeingEdited = textField;
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
_textBeingEdited = nil;
}
また、hideKeyboardメソッドを次のように変更しました。
- (IBAction)hideKeyboard:(id)sender
{
// Just call resignFirstResponder on all UITextFields and UITextViews in this VC
// Why? Because it works and checking which one was last active gets messy.
//UITextField * tf = (UITextField *) sender;
[_textBeingEdited resignFirstResponder];
}
私はここで多くの応答を試みましたが、運がありませんでした。タップジェスチャー認識機能が原因で、UIButtons
タップしても反応しません。cancelsTouchesInView
プロパティをNOジェスチャレコグナイによって、。
これが最終的に問題を解決したものです:
ivarを持っている:
UITapGestureRecognizer *_keyboardDismissGestureRecognizer;
テキストフィールドが編集を開始したら、ジェスチャー認識機能を設定します。
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
if(_keyboardDismissGestureRecognizer == nil)
{
_keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissKeyboard)] autorelease];
_keyboardDismissGestureRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
}
}
次に、dismissKeyboard
メソッドを設定する方法に秘訣があります。
- (void) dismissKeyboard
{
[self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01];
}
- (void) dismissKeyboardSelector
{
[self.view endEditing:YES];
[self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer];
_keyboardDismissGestureRecognizer = nil;
}
dismissKeyboardSelector
タッチ処理実行スタックから実行を取り出すことについて何かがあるだけだと思います...
resignFirstResponder
そこにメッセージを書き込んだテキストフィールドにメッセージを送信します。詳細については、この投稿を参照してください。
この例では、aTextFieldが唯一のUITextFieldです。他にUITextViewsがある場合は、やるべきことが少しあります。
// YourViewController.h
// ...
@interface YourViewController : UIViewController /* some subclass of UIViewController */ <UITextFieldDelegate> // <-- add this protocol
// ...
@end
// YourViewController.m
@interface YourViewController ()
@property (nonatomic, strong, readonly) UITapGestureRecognizer *singleTapRecognizer;
@end
// ...
@implementation
@synthesize singleTapRecognizer = _singleTapRecognizer;
// ...
- (void)viewDidLoad
{
[super viewDidLoad];
// your other init code here
[self.view addGestureRecognizer:self.singleTapRecognizer];
{
- (UITapGestureRecognizer *)singleTapRecognizer
{
if (nil == _singleTapRecognizer) {
_singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToDismissKeyboard:)];
_singleTapRecognizer.cancelsTouchesInView = NO; // absolutely required, otherwise "tap" eats events.
}
return _singleTapRecognizer;
}
// Something inside this VC's view was tapped (except the navbar/toolbar)
- (void)singleTapToDismissKeyboard:(UITapGestureRecognizer *)sender
{
NSLog(@"singleTap");
[self hideKeyboard:sender];
}
// When the "Return" key is pressed on the on-screen keyboard, hide the keyboard.
// for protocol UITextFieldDelegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
NSLog(@"Return pressed");
[self hideKeyboard:textField];
return YES;
}
- (IBAction)hideKeyboard:(id)sender
{
// Just call resignFirstResponder on all UITextFields and UITextViews in this VC
// Why? Because it works and checking which one was last active gets messy.
[aTextField resignFirstResponder];
NSLog(@"keyboard hidden");
}
- (void)viewDidLoad
{
[super viewDidLoad];
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleSingleTap:)];
[singleTapGestureRecognizer setNumberOfTapsRequired:1];
[singleTapGestureRecognizer requireGestureRecognizerToFail:singleTapGestureRecognizer];
[self.view addGestureRecognizer:singleTapGestureRecognizer];
}
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer
{
[self.view endEditing:YES];
[textField resignFirstResponder];
[scrollView setContentOffset:CGPointMake(0, -40) animated:YES];
}
このコードをViewController.mファイルに追加します。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
この場合、ScrollViewを使用してScrollViewに追加することができます。そして、[表示]をTextField
タップしてScrollView
から、キーボードを閉じます。念のためサンプルコードを作ってみました。このような、
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.tap(_:)))
view.addGestureRecognizer(tapGesture)
// Do any additional setup after loading the view, typically from a nib.
}
func tap(gesture: UITapGestureRecognizer) {
textField.resignFirstResponder()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
あなたのストーリーボードはちょうどそれを見てください。
UITextFieldの外側をクリックすると、UITapGestureRecongnizerメソッドを使用してキーボードを閉じることができます。ユーザーがUITextFieldの外側をクリックするたびにこのメソッドを使用すると、キーボードが非表示になります。以下は、それを使用するためのコードスニペットです。
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissk)];
[self.view addGestureRecognizer:tap];
//Method
- (void) dismissk
{
[abctextfield resignFirstResponder];
[deftextfield resignFirstResponder];
}