Мені цікаво, як змусити клавіатуру зникати, коли користувач торкається поза "a" UITextField
.
Мені цікаво, як змусити клавіатуру зникати, коли користувач торкається поза "a" UITextField
.
Відповіді:
Вам потрібно буде додати UITapGestureRecogniser
та призначити його перегляду, а потім зателефонувати подати першу відповідь у відповідь UITextField
на селекторі.
Код:
У переглядіDidLoad
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
У відхиленніKeyboard:
-(void)dismissKeyboard
{
[aTextField resignFirstResponder];
}
(Де aTextField
знаходиться текстове поле, яке відповідає за клавіатуру)
Версія Swift 3 виглядає так
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
self.view.addGestureRecognizer(tapGesture)
Для відставкиKeyboard
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];
на @qiaoyi; У мене виникла проблема з таблицею, яка не відповідає на вибір рядків. Через 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:
[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
}
}
Швидка версія, це працює в поєднанні з іншими елементами (наприклад, тими 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#
. FYI Цей крапку з комою дозволено в синтаксисі, просто не потрібно.
Як щодо цього: я знаю, що це стара публікація. Це може комусь допомогти :)
- (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];
}
}
}
}
Це хороше загальне рішення:
Завдання-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 oneliner
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
Я думаю, що найпростіший (і найкращий) спосіб зробити це підкласифікувати свій глобальний погляд і використовувати hitTest:withEvent
метод для прослуховування будь-якого дотику. Дотики до клавіатури не реєструються, тому hitTest: withEvent викликається лише тоді, коли ви торкаєтесь / прокручуєте / проведіть пальцем / щіпкою ... десь ще, а потім дзвоніть [self endEditing:YES]
.
Це краще, ніж використовувати, touchesBegan
тому що touchesBegan
не викликаються, якщо натиснути кнопку вгорі подання. Це краще, ніж те, UITapGestureRecognizer
що не вдається розпізнати жест прокрутки, наприклад. Це також краще, ніж використовувати тьмяний екран, оскільки в складному та динамічному користувальницькому інтерфейсі ви не можете розміщувати тьмяний екран скрізь. Більше того, це не блокує інших дій, вам не потрібно натискати двічі, щоб вибрати кнопку зовні (як у випадку з aUIPopover
).
Крім того, це краще, ніж дзвонити [textField resignFirstResponder]
, тому що у вас може бути багато текстових полів на екрані, тому це працює для всіх.
Це повинен бути найпростіший спосіб приховати клавіатуру, торкнувшись зовні:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
(Від Як звільнити клавіатури , коли користувач водопровідного іншій області за межі TextField? )
Якщо вигляд взагалі вбудований у 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):
Тепер вам потрібно підключити цю дію до того, щоб користувач жестом торкнувся клавіатури.
Важливо - Вам потрібно перетворити "UIView", який міститься у вашій дошці даних , в UIControl , щоб він міг отримувати події. Виберіть подання з ієрархії сцен контролера перегляду:
... і змінити свій клас:
Тепер перетягніть з невеликого кола поруч із "отриманою дією" для вашої сцени на "порожню" частину сцени (насправді ви перетягуєте "Отриману дію" до UIControl). Вам буде показаний вибір подій, на які ви можете підключити свою дію:
Виберіть варіант "торкніться всередині". Тепер ви підключили створений вами ІБА до дії користувача про торкання клавіатури. Коли користувач натискає клавіатуру, вона тепер буде прихована.
(ПРИМІТКА. Щоб підключити дію до події, ви також можете перетягнути з отриманої дії безпосередньо на UIControl в ієрархії перегляду контролерів. Це відображається як "Керування" в ієрархії.)
Якщо я маю право, ви хочете відмовитись від хитрого натискання клавіатури на сторону, textfield
але у вас немає посилання на вашу 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
всієї 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 і змінити сенсорний метод.
Це добре працює для мене. І це централізоване вирішення цієї проблеми.
#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:
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;
}
Також я змінив метод hidKeyboard наступним чином:
- (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];
}
Один з найпростіших і найкоротших способів - додати цей код до свого viewDidLoad
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self.view
action:@selector(endEditing:)]];
Я спробував багато відповідей тут і не пощастило. Мій розпізнавальний жест натискання завжди змушував мене UIButtons
не реагувати при натисканні , навіть коли я встановлювавcancelsTouchesInView
властивість розпізнавача жестів на НІ.
Ось що врешті-решт вирішило питання:
Майте івар:
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 та додати його до TextField
ScrollView, і я хочу Торкнутись 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.
}
}
Ваша розговорка. Подивіться на це так само.
Ви можете використовувати метод UITapGestureRecongnizer для відхилення клавіатури, клацнувши поза межами UITextField. За допомогою цього методу кожен раз, коли користувач натисне за межі UITextField, тоді клавіатура отримає відхилення. Нижче наведено фрагмент коду для його використання.
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissk)];
[self.view addGestureRecognizer:tap];
//Method
- (void) dismissk
{
[abctextfield resignFirstResponder];
[deftextfield resignFirstResponder];
}