Zastanawiam się, jak sprawić, aby klawiatura zniknęła, gdy użytkownik dotknie poza UITextField
.
ios
cocoa-touch
uitextfield
uikit
jonepatr
źródło
źródło
Odpowiedzi:
Musisz dodać
UITapGestureRecogniser
i przypisać go do widoku, a następnie wywołać rezygnację jako pierwsza osoba odpowiadająca naUITextField
selektorze.Kod:
In viewDidLoad
Odrzuć klawiaturę:
(Gdzie
aTextField
jest pole tekstowe odpowiedzialne za klawiaturę)Tak wygląda wersja Swift 3
Aby zamknąć klawiaturę
źródło
[aTextField resignFirstResponder]
by[self.view endEditing:YES];
to nie wymagało odniesienia do pola tekstowego i będzie działać na wielu polach tekstowych[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
na odpowiedź @qiaoyi; Miałem problem z tabelą, która nie reagowała na wybrane wiersze. 5 lat później mam nadzieję, że pomoże to komuś innemu.self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
Zebrałem kilka odpowiedzi.
Użyj ivara, który zostanie zainicjowany podczas
viewDidLoad:
Odrzuć to, co jest obecnie edytowane:
źródło
Sprawdź to, to byłby najłatwiejszy sposób, aby to zrobić,
Lub
Ta biblioteka będzie obsługiwać automatyczne przewijanie paska przewijania, dotknij spacji, aby ukryć klawiaturę itp.
https://github.com/michaeltyson/TPKeyboardAvoiding
źródło
Widzę, że niektórzy ludzie mają problemy z użyciem tej
UITapGestureRecognizer
metody. Najłatwiejszym sposobem, w jaki osiągnąłem tę funkcjonalność, pozostawiając nienaruszone zachowanie mojego przycisku w stanie nienaruszonym, jest dodanie tylko jednej linii do odpowiedzi @ Jensen2k:Dzięki temu moje istniejące przyciski nadal działały bez użycia metody @Dmitry Sitnikov.
Przeczytaj o tym
property
tutaj (szukajCancelsTouchesInView
): Odwołanie do klasy UIGestureRecognizerNie jestem pewien, jak to będzie działać z paskami przewijania, ponieważ widzę, że niektórzy mieli problemy, ale mam nadzieję, że ktoś inny może spotkać się z tym samym scenariuszem, co ja.
źródło
UIImageView
, dodaj,[imageView setUserInteractionEnabled:NO];
a ty „klikniesz” go, co sprawia, że ta metoda działa.Lepiej jest utworzyć
UIView
instancjęUIControl
(w programie do tworzenia interfejsów), a następnie połączyć ichTouchUpInside
zdarzenie zdismissKeyboard
metodą. TaIBAction
metoda będzie wyglądać następująco:źródło
UITapGestureRecognizer
przeszkadzało to w naciskaniu przycisków w widoku).touchesEnded
nie działał, ponieważ wystąpiłUIScrollView
Szybki 4
Skonfiguruj
UIViewController
tę metodę rozszerzenia raz, np. WviewDidLoad
:a klawiatura zostanie zwolniona nawet po dotknięciu przycisku
NavigationBar
.źródło
Wersja szybka, działa w połączeniu z innymi elementami (takimi jak
UIButton
inneUITextField
):źródło
self
zamiastself.view
canclesTouchesInView
to przydatna właściwość do użycia. Dzięki.c#
. Do Twojej wiadomości: Średnik jest dozwolony pod względem składni, po prostu nie jest konieczny.Co powiesz na to: wiem, że to stary post. Może komuś pomóc :)
źródło
To dobre ogólne rozwiązanie:
Cel C:
Szybki:
W oparciu o rozwiązanie @icodebuster: https://stackoverflow.com/a/18756253/417652
źródło
Swift 4 oneliner
źródło
Myślę, że najłatwiejszym (i najlepszym) sposobem na zrobienie tego jest podklasowanie globalnego widoku i użycie
hitTest:withEvent
metody słuchania dowolnego dotyku. Dotyki na klawiaturze nie są rejestrowane, więc hitTest: withEvent jest wywoływany tylko po dotknięciu / przewinięciu / przesunięciu / ściśnięciu ... gdzie indziej, a następnie zadzwonić[self endEditing:YES]
.Jest to lepsze niż używanie,
touchesBegan
ponieważtouchesBegan
nie są wywoływane, jeśli klikniesz przycisk u góry widoku. Jest to lepsze niż, na przykład,UITapGestureRecognizer
który nie może rozpoznać gestu przewijania. Jest to również lepsze niż używanie przyciemnionego ekranu, ponieważ w złożonym i dynamicznym interfejsie użytkownika nie można wszędzie umieścić przyciemnionego ekranu. Co więcej, nie blokuje innych działań, nie musisz stuknąć dwa razy, aby wybrać przycisk na zewnątrz (jak w przypadku aUIPopover
).Jest to także lepsze niż dzwonienie
[textField resignFirstResponder]
, ponieważ na ekranie może znajdować się wiele pól tekstowych, więc działa to na wszystkie z nich.źródło
To musi być najprostszy sposób na ukrycie klawiatury, dotykając jej na zewnątrz:
(z Jak odrzucić klawiaturę, gdy użytkownik stuknie inny obszar poza polem tekstowym? )
źródło
Jeśli widok jest w ogóle osadzony w
UIScrollView
, możesz użyć następujących opcji:Pierwsza z nich będzie animować klawiaturę poza ekranem, gdy przewijany jest widok tabeli, a później ukryje klawiaturę, podobnie jak standardowa aplikacja Wiadomości.
źródło
Możesz to zrobić za pomocą Storyboard w XCode 6 i nowszych:
Utwórz akcję, aby ukryć klawiaturę
Dodaj to do pliku nagłówka klasy używanej przez twój ViewController:
Następnie dodaj to do pliku implementacji tego samego ViewController:
Będzie to teraz jedna z „Otrzymanych akcji” dla sceny scenorysu (tj. ViewController):
Podłącz akcję do zdarzenia użytkownika
Teraz musisz połączyć to działanie z gestem użytkownika polegającym na oderwaniu się od klawiatury.
Ważne - Musisz przekonwertować „UIView” zawarty w twojej serii ujęć na UIControl , aby mógł odbierać zdarzenia. Wybierz widok z hierarchii Scena kontrolera widoku:
... i zmień klasę:
Teraz przeciągnij z małego kółka obok „odebranej akcji” dla swojej sceny na „pustą” część sceny (w rzeczywistości przeciągasz „Otrzymaną akcję” do UIControl). Zobaczysz wybór wydarzeń, które możesz podłączyć do:
Wybierz opcję „retusz wewnątrz”. Teraz podłączyłeś utworzoną IBAction do akcji polegającej na dotykaniu klawiatury. Gdy użytkownik stuknie klawiaturę, teraz będzie ukryta.
(UWAGA: Aby dołączyć akcję do zdarzenia, możesz również przeciągnąć z odebranej akcji bezpośrednio do UIControl w hierarchii kontrolerów widoku. Jest ona wyświetlana jako „Kontrola” w hierarchii.)
źródło
Jeśli dobrze zrozumiałem, chcesz zrezygnować z dotykania klawiatury po zewnętrznej stronie,
textfield
ale nie masz swojego odniesieniatextfield
.Spróbuj tego;
reftextField
Teraz w
textFieldDidBeginEditing
ustawionym polu tekstowym odniesienia doTeraz możesz z radością korzystać z dowolnego przycisku zegara (zalecane dodanie przezroczystego przycisku przy rozpoczęciu edycji)
Lub zrezygnuj z przycisku gotowe, spróbuj tego.
źródło
Wystarczy dodać do listy tutaj moją wersję, jak odrzucić klawiaturę na zewnątrz.
viewDidLoad:
Gdziekolwiek:
źródło
Mnóstwo świetnych odpowiedzi na temat używania -
UITapGestureRecognizer
w tym wszystkichUITextField
przycisków zerowania (X). Rozwiązaniem jest stłumienie rozpoznawania gestów za pośrednictwem jego delegata:To nie jest najbardziej niezawodne rozwiązanie, ale działa dla mnie.
źródło
return !touchViewIsButton
. Sądzę, że wszelkie inne przyciski, które muszą zwolnić klawiaturę, powinny to robić w swoich działaniach. Ponadto TouchUpInside może nie zostać wywołany, gdy zmieni się układ po zwolnieniu klawiatury.Możesz utworzyć kategorię dla UiView i przesłonić szlak Rozpocznij meathod w następujący sposób.
Działa dla mnie dobrze i jest scentralizowanym rozwiązaniem tego problemu.
źródło
Szybka wersja odpowiedzi @ Jensen2k:
Jedna wkładka
źródło
Użyłem przykładu Barry do mojego nowego projektu. Działa świetnie! ale musiałem wprowadzić niewielką zmianę, wymaganą do zwolnienia klawiatury tylko dla edytowanego pola tekstowego.
Dodałem więc do przykładu Barry:
Zmieniłem również metodę hideKeyboard w następujący sposób:
źródło
Jednym z najłatwiejszych i najkrótszych sposobów jest dodanie tego kodu do swojego
viewDidLoad
źródło
źródło
Próbowałem tutaj wielu odpowiedzi i nie miałem szczęścia. Mój rozpoznawanie gestów dotknij zawsze powodowało, że
UIButtons
nie reagowałem po stuknięciu, nawet gdy ustawiłemcancelsTouchesInView
właściwość rozpoznawania gestów na NIE.Oto, co ostatecznie rozwiązało problem:
Mieć ivar:
Gdy pole tekstowe zacznie się edytować, ustaw rozpoznawanie gestów:
Zatem sztuczka polega na tym, jak skonfigurować
dismissKeyboard
metodę:Wydaje mi się, że jest coś w
dismissKeyboardSelector
wydobywaniu wykonania ze stosu wykonawczego obsługi dotykowej ...źródło
Wyślij wiadomość
resignFirstResponder
do pliku tekstowego, który ją tam umieścił. Więcej informacji można znaleźć w tym poście .źródło
To działa
W tym przykładzie aTextField jest jedynym UITextField ... Jeśli są inne lub UITextViews, jest trochę więcej do zrobienia.
źródło
źródło
Dodaj ten kod do pliku ViewController.m :
źródło
W takim przypadku można użyć ScrollView i dodać do
TextField
ScrollView i chcę StuknijScrollView
i Widok, a następnie Zamknij klawiaturę. Na wszelki wypadek próbowałem utworzyć przykładowy kod. Lubię to,Twój Storyboard Spójrz na to tak jak.
źródło
Możesz użyć metody UITapGestureRecongnizer do odrzucenia klawiatury, klikając poza polem UITextField. Korzystając z tej metody, ilekroć użytkownik kliknie poza UITextField, klawiatura zostanie zwolniona. Poniżej znajduje się fragment kodu umożliwiający jego użycie.
źródło
Ustaw pola tekstowe, które delegat w widoku załadował:
Dodaj tę funkcję:
źródło