Kullanıcı a dışına dokunduğunda klavyenin nasıl kaybolacağını merak ediyorum UITextField
.
Kullanıcı a dışına dokunduğunda klavyenin nasıl kaybolacağını merak ediyorum UITextField
.
Yanıtlar:
Bir UITapGestureRecogniser
görünüm eklemeniz ve görünüme atamanız ve ardından UITextField
seçicisinin üzerindeki ilk yanıtlayıcıyı çağırmanız gerekir.
Kod:
ViewDidLoad içinde
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
[self.view addGestureRecognizer:tap];
Kapatmada
-(void)dismissKeyboard
{
[aTextField resignFirstResponder];
}
( aTextField
Klavyeden sorumlu metin alanı nerede )
Swift 3 sürümü böyle görünüyor
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard (_:)))
self.view.addGestureRecognizer(tapGesture)
Kapatma için
@objc func dismissKeyboard (_ sender: UITapGestureRecognizer) {
aTextField.resignFirstResponder()
}
[aTextField resignFirstResponder]
olurdu [self.view endEditing:YES];
bu metin alanı bir başvuru gerekmez ve çoklu textfields için çalışacak
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
Qiaoyi'nin cevabı başına @ParthBhatt ekledim ; Satır seçimlerine yanıt vermeyen bir tablo ile ilgili bir sorun yaşadım. 5 yıl sonra, umarım bu başka birine yardım eder.
self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
Birkaç cevap verdim.
Sırasında başlatılan bir ivar kullanın viewDidLoad:
UIGestureRecognizer *tapper;
- (void)viewDidLoad
{
[super viewDidLoad];
tapper = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSingleTap:)];
tapper.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapper];
}
Şu anda ne düzenlediğini reddet:
- (void)handleSingleTap:(UITapGestureRecognizer *) sender
{
[self.view endEditing:YES];
}
Bunu kontrol et, bunu yapmanın en kolay yolu bu olurdu,
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];// this will do the trick
}
Veya
Bu kütüphane kaydırma çubuğu otomatik kaydırma, klavyeyi gizlemek için alan vb.
Bazı insanların UITapGestureRecognizer
yöntemi kullanarak sorun yaşadıklarını görüyorum . Mevcut düğmemin dokunma davranışını olduğu gibi bırakırken bu işlevselliği gerçekleştirmenin en kolay yolu @ Jensen2k'nin cevabına yalnızca bir satır eklemektir:
[tap setCancelsTouchesInView:NO];
Bu, mevcut düğmelerimin @Dmitry Sitnikov'un yöntemini kullanmadan çalışmaya devam etmesini sağladı.
Bunun hakkında property
buradan okuyun (arayın CancelsTouchesInView
): UIGestureRecognizer Sınıf Referansı
Bazılarının sorunları olduğunu gördüğüm gibi, kaydırma çubuklarıyla nasıl çalışacağından emin değilim, ama umarım bir başkası benimle aynı senaryoya girebilir.
UIImageView
, görünümün arkasında bir arka plan görüntüsü olanlar için , eklemek [imageView setUserInteractionEnabled:NO];
ve "tıkırtı", hangi bu yöntemi çalışır.
Arayüz oluşturucuda UIView
bir örneğinizi oluşturmak UIControl
ve ardından TouchUpInside
olaylarını dismissKeyboard
yönteme bağlamak daha iyidir . Bu IBAction
yöntem şöyle görünecektir:
- (IBAction)dismissKeyboard:(id)sender {
[aTextBox resignFirstResponder];
}
UITapGestureRecognizer
görünümün içindeki düğmelere dokunmakla karıştı). cevaplama zinciri ile touchesEnded
bir UIScrollView
karışıklık olduğu için işe yaramadı .)
Hızlı 4
UIViewController
Bu uzantı yöntemiyle bir kez kurun , örneğin viewDidLoad
:
override func viewDidLoad() {
super.viewDidLoad()
self.setupHideKeyboardOnTap()
}
ve klavyeye dokunarak bile kapatılır 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
}
}
Hızlı sürüm, bu diğer öğelerle birlikte çalışır (bir UIButton
veya diğeri gibi UITextField
):
override func viewDidLoad() {
super.viewDidLoad()
let tapper = UITapGestureRecognizer(target: self, action:#selector(endEditing))
tapper.cancelsTouchesInView = false
view.addGestureRecognizer(tapper)
}
self
ziyade olmalıdırself.view
canclesTouchesInView
kullanışlı bir özelliktir. Teşekkürler.
c#
. FYI Bu noktalı virgül sözdizimine izin verilir, sadece gerekli değildir.
Buna ne dersiniz: Bunun eski bir yazı olduğunu biliyorum. Birine yardımcı olabilir :)
- (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];
}
}
}
}
Bu iyi bir genel çözümdür:
Objective-C:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
Swift:
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
@İcodebuster çözümüne dayanarak: https://stackoverflow.com/a/18756253/417652
Swift 4 oneliner
view.addGestureRecognizer(UITapGestureRecognizer(target: view, action: #selector(UIView.endEditing(_:))))
Bunu yapmanın en kolay (ve en iyi) yolunun, küresel görüşünüzü alt sınıflara hitTest:withEvent
ayırmak ve herhangi bir dokunuşu dinlemek için yöntemi kullanmak olduğunu düşünüyorum. Klavyedeki dokunuşlar kaydedilmedi, bu yüzden hitTest: withEvent yalnızca başka bir yere / kaydırma / kaydırma / sıkıştırma ... öğesine dokunduğunuzda arayın, sonra arayın [self endEditing:YES]
.
Bu, kullanmaktan daha iyidir touchesBegan
çünkü touchesBegan
görünümün üstündeki bir düğmeyi tıklarsanız çağrılmaz. UITapGestureRecognizer
Örneğin, kaydırma hareketini tanıyamayacak kadar iyidir . Ayrıca loş bir ekran kullanmaktan daha iyidir, çünkü karmaşık ve dinamik bir kullanıcı arayüzünde loş ekranı her yere koyamazsınız. Ayrıca, diğer eylemleri engellemez, dışarıda bir düğme seçmek için iki kez dokunmanıza gerek yoktur (a durumunda olduğu gibi UIPopover
).
Ayrıca, aramaktan daha iyidir [textField resignFirstResponder]
, çünkü ekranda birçok metin alanınız olabilir, bu yüzden hepsi için çalışır.
Dışarıya dokunarak klavyenizi gizlemenin en kolay yolu bu olmalıdır:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
(dan nasıl klavyeyi kullanıcı musluk diğer bölge dışında textfield görevden? )
Görünüm bir gömülü ise UIScrollView
, aşağıdakileri kullanabilirsiniz:
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
Birincisi, tablo görünümü kaydırıldığında klavyenin kapalı ekranını canlandıracak ve daha sonra klavyeyi stok Mesajları uygulaması gibi gizleyecektir.
Bunların iOS 7.0 veya üstü sürümlerde kullanılabildiğini unutmayın.
Bunu XCode 6 ve sonraki sürümlerde Storyboard'u kullanarak yapabilirsiniz:
Bunu ViewController tarafından kullanılan sınıfın başlık dosyasına ekleyin:
@interface TimeDelayViewController : UIViewController <UITextFieldDelegate>
- (IBAction)dissmissKeyboardOnTap:(id)sender;
@end
Daha sonra bunu aynı ViewController'ın uygulama dosyasına ekleyin:
- (IBAction)dissmissKeyboardOnTap:(id)sender{
[[self view]endEditing:YES];
}
Bu, şimdi film şeridi sahneniz için 'Alınan İşlemlerden' biri olacak (örn. ViewController):
Şimdi bu eylemi klavyeden dokunma kullanıcı hareketine bağlamanız gerekir.
Önemli - Film şeridinizde bulunan 'UIView'i bir UIControl'e dönüştürmeniz gerekir , böylece olaylar alabilir. Görünüm Denetleyicisi Sahne Alanı hiyerarşisinden görünümü seçin:
... ve sınıfını değiştirin:
Şimdi, sahneniz için 'alınan eylemin' yanındaki küçük daireden sahnenizin 'boş' bir bölümüne sürükleyin (aslında 'Alınan Eylem'i' UIControl'e sürüklersiniz). Eyleminizi aşağıdakilere bağlayabileceğiniz çeşitli etkinlikler gösterilir:
'İçine rötuş' seçeneğini belirtin. Şimdi oluşturduğunuz IBAction'ı klavyeye dokunmak için bir kullanıcı eylemine bağladınız. Kullanıcı klavyeyi kapattığında artık gizlenecektir.
(NOT: Eylemi olaya bağlamak için, alınan eylemden doğrudan Görünüm Denetleyicileri hiyerarşinizde UIControl'e sürükleyebilirsiniz. Hiyerarşide 'Denetim' olarak görüntülenir.)
Eğer seni haklı çıkarsam dışarıya dokunarak klavye istifa etmek istersin textfield
ama referansın yok textfield
.
Bunu dene;
reftextField
Şimdi textFieldDidBeginEditing
referans verilen metin alanını
- (void) textFieldDidBeginEditing:(UITextField *)textField{
reftextField = textField;
}
Artık herhangi bir düğme saatinde mutlu bir şekilde kullanabilirsiniz, (önerilen düzenlemeye başlama üzerine şeffaf bir düğme ekleyerek)
- (void)dismissKeyboard {
[reftextField resignFirstResponder];
}
Veya bitmiş düğmesini istifa etmek için bunu deneyin.
//for resigning on done button
- (BOOL) textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
Sadece bu listeye eklemek için dış dokunuşta bir klavyeyi kapatmak nasıl benim sürüm.
viewDidLoad:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:singleTap];
Herhangi bir yer:
-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
[textFieldName resignFirstResponder];
puts("Dismissed the keyboard");
}
Burada - tüm UITapGestureRecognizer
mola UITextField
net (X) düğmesini kullanma hakkında birçok harika cevap . Çözüm, delege aracılığıyla hareket tanıyıcıyı bastırmaktır:
- (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);
}
En sağlam çözüm değil ama benim için çalışıyor.
return !touchViewIsButton
. Sanırım klavyeyi kapatması gereken diğer düğmeler eylemlerinde bunu yapmalı. Ayrıca, klavye işten çıkarmada düzen değiştiğinde TouchUpInside çağrılamayabilir.
UiView için kategori oluşturabilir ve touchtoBegan meathod'u aşağıdaki gibi geçersiz kılabilirsiniz.
Benim için iyi çalışıyor ve bu sorunun çözümünü merkezileştiriyor.
#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'in cevabının hızlı versiyonu:
let gestureRecognizer : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "dismissKeyboard")
self.view.addGestureRecognizer(gestureRecognizer)
func dismissKeyboard() {
aTextField.resignFirstResponder()
}
Bir astar
self.view.addTapGesture(UITapGestureRecognizer.init(target: self, action: "endEditing:"))
Barry örneğini yeni gelişimim için kullandım. Harika çalıştı! ancak klavyeyi sadece metin alanı için kapatmak için gerekli olan hafif bir değişiklik eklemek zorunda kaldım.
Barry örneğine aşağıdakileri ekledim:
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
_textBeingEdited = textField;
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{
_textBeingEdited = nil;
}
Ayrıca, hideKeyboard yöntemini şu şekilde değiştirdim:
- (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];
}
En kolay ve en kısa yollardan biri, bu kodu viewDidLoad
[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self.view
action:@selector(endEditing:)]];
Burada yanıtların çoğunu denedim ve hiç şansım olmadı. Dokunma hareketi tanıyıcı, her UIButtons
zaman dokunduğumda, hattacancelsTouchesInView
hareket tanıyıcısının özelliğini HAYIR olarak .
Sorunu sonunda çözen de buydu:
Bir ivarınız var:
UITapGestureRecognizer *_keyboardDismissGestureRecognizer;
Bir metin alanı düzenlemeye başladığında, hareket tanıyıcıyı ayarlayın:
- (void) textFieldDidBeginEditing:(UITextField *)textField
{
if(_keyboardDismissGestureRecognizer == nil)
{
_keyboardDismissGestureRecognizer = [[[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissKeyboard)] autorelease];
_keyboardDismissGestureRecognizer.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:_keyboardDismissGestureRecognizer];
}
}
Sonra hile dismissKeyboard
yöntemi nasıl ayarladığınızdır :
- (void) dismissKeyboard
{
[self performSelector:@selector(dismissKeyboardSelector) withObject:nil afterDelay:0.01];
}
- (void) dismissKeyboardSelector
{
[self.view endEditing:YES];
[self.view removeGestureRecognizer:_keyboardDismissGestureRecognizer];
_keyboardDismissGestureRecognizer = nil;
}
Sanırım sadece dismissKeyboardSelector
dokunma işleme yürütme yığını yürütme hakkında bir şey var ...
resignFirstResponder
Oraya yerleştirilen metin dosyasına mesaj gönderin. Daha fazla bilgi için lütfen bu gönderiye bakın .
Bu örnekte, aTextField tek UITextField ... Diğerleri veya UITextViews varsa, yapacak küçük bir şey daha var.
// 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];
}
Bu kodu ViewController.m dosyanıza ekleyin :
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
Bu durumda, ScrollView kullanmak ve TextField
ScrollView içinde eklenebilir ve Ben dokunun ScrollView
ve Görünüm sonra Klavyeyi Kapat istiyorum . Her ihtimale karşı örnek kod oluşturmaya çalıştım. Bunun gibi,
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.
}
}
Storyboard'unuz Tıpkı Like Like'a bakın.
UITextField dışına tıklayarak klavyeyi kapatmak için UITapGestureRecongnizer yöntemini kullanabilirsiniz. Kullanıcı UITextField dışına tıkladığında bu yöntemi kullanarak klavye işten çıkarılır. Kullanmak için kod snippet'i aşağıdadır.
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(dismissk)];
[self.view addGestureRecognizer:tap];
//Method
- (void) dismissk
{
[abctextfield resignFirstResponder];
[deftextfield resignFirstResponder];
}