Mam aplikację, która ma pole tekstowe w dolnej połowie widoku. Oznacza to, że kiedy idę pisać w polu tekstowym, klawiatura pokrywa pole tekstowe.
Jak mógłbym poruszyć widok w górę podczas pisania, aby zobaczyć, co piszę, a następnie przesunąć go z powrotem do pierwotnego miejsca po zniknięciu klawiatury?
Szukałem wszędzie, ale wszystkie rozwiązania wydają się być w Obj-C, których nie mogę jeszcze całkiem przekonwertować.
Każda pomoc byłaby bardzo mile widziana.
ios
swift
uikit
nsnotificationcenter
uikeyboard
Alex Catchpole
źródło
źródło
it is actually needed to scroll view up when keyboard appears
Odpowiedzi:
Oto rozwiązanie bez obsługi przełączania z jednego pola tekstowego na inny:
Aby rozwiązać ten problem, zamień dwie funkcje na
keyboardWillShow/Hide
następujące:EDYCJA DLA SWIFT 3.0:
EDYCJA DLA SWIFT 4.0:
EDYCJA SWIFT 4.2:
źródło
UIKeyboardFrameEndUserInfoKey
raczej niżUIKeyboardFrameBeginUserInfoKey
podczas uzyskiwania rozmiaru klawiatury. Nie jestem pewien, dlaczego w tej chwili, ale te pierwsze przyniosą bardziej spójne wyniki.UIKeyboardFrameBeginUserInfoKey
zUIKeyboardFrameEndUserInfoKey
. Pierwsza daje ramkę początkową klawiatury, która czasami jest zerowa, a druga ramkę końcową klawiatury.Najłatwiejszy sposób, który nawet nie wymaga kodu:
Obiekt automatycznie przesunie się w górę za pomocą klawiatury, w synchronizacji.
źródło
DispatchQueue.main.async {}
aby to naprawić. Dobra robota! Kciuki w górę!Jedna z popularnych odpowiedzi w tym wątku używa następującego kodu:
Istnieje oczywisty problem z przesunięciem widoku o wartość statyczną. Będzie ładnie wyglądać na jednym urządzeniu, ale będzie źle wyglądać przy dowolnej konfiguracji rozmiaru. Musisz uzyskać wysokość klawiatury i użyć jej jako wartości przesunięcia.
Oto rozwiązanie, które działa na wszystkich urządzeniach i obsługuje wielkość liter, w której użytkownik ukrywa predykcyjne pole tekstowe podczas pisania.
Rozwiązanie
Ważne, aby pamiętać, że jako parametr obiektu przekazujemy self.view.window. To zapewni nam dane z naszej klawiatury, takie jak jej wysokość!
Sprawimy, że będzie ładnie wyglądał na wszystkich urządzeniach i obsłuży przypadek, w którym użytkownik dodaje lub usuwa przewidywane pole tekstowe.
Usuń obserwatorów
Nie zapomnij usunąć obserwatorów przed opuszczeniem widoku, aby zapobiec przesyłaniu niepotrzebnych wiadomości.
Aktualizacja na podstawie pytania z komentarzy:
Jeśli masz dwa lub więcej pól tekstowych, możesz sprawdzić, czy wartość view.frame.origin.y wynosi zero.
źródło
Dodaj to do kontrolera widoku. Działa jak marzenie. Po prostu dostosuj wartości.
źródło
Ulepszyłem nieco jedną z odpowiedzi, aby działała z różnymi klawiaturami i różnymi widokami / polami tekstowymi na jednej stronie:
Dodaj obserwatorów:
Usuń obserwatorów:
źródło
Nie reklama, promocja ani spam , tylko dobre rozwiązanie. Wiem, że to pytanie ma prawie 30 odpowiedzi i jestem tak zszokowany, że nikt nawet nie wspomniał o tym pięknym projekcie GitHub, który robi to wszystko dla Ciebie, a nawet lepiej. Wszystkie odpowiedzi przesuwają widok w górę. Właśnie rozwiązałem wszystkie moje problemy z tym IQKeyboardManager. Ma ponad 13000 gwiazd.
Po prostu dodaj to do pliku podfile, jeśli używasz szybkiego
a następnie wewnątrz AppDelegate.swift
import IQKeyboardManagerSwift
Dodaj linię,
IQKeyboardManager.shared.enable = true
aby ją włączyćTo rozwiązanie jest koniecznością, jeśli wybierasz się na produkcję.
źródło
import IQKeyboardManager
i użyłemIQKeyboardManager.shared().isEnabled = true
w AppDelegateBłąd czarnego ekranu (Swift 4 i 4.2) .
Naprawiłem problem z czarnym ekranem. W sprawdzonym rozwiązaniu Wysokość klawiatury zmienia się po stuknięciu, co powoduje czarny ekran.
Muszę użyć UIKeyboardFrameEndUserInfoKey zamiast UIKeyboardFrameBeginUserInfoKey
źródło
Widzę, że wszystkie odpowiedzi przesuwają sam widok o wartość wysokości klawiatury. Cóż, mam szczegółową odpowiedź, która może być użyteczna, jeśli używasz ograniczeń, tj. Które
autolayout
poruszają widok, zmieniając jego wartość ograniczenia (na przykład dolne lub górne ograniczenie) o określoną wartość lub możesz użyć wartości rozmiaru klawiatury.W tym przykładzie używam ograniczenia dolnego z pola tekstowego do Widoku układu dolnego o wartości początkowej 175.
źródło
Nastąpiły pewne zmiany w sposobie definiowania KeyboardWillHideNotification.
To rozwiązanie działa z Swift 4.2 :
źródło
Po 4-5 godzinach walki przyszedłem z prostym rozszerzeniem UIViewController z prostym kodem, który działa jak urok
* Widok nie powinien się poruszać, gdy TextField znajduje się nad klawiaturą
* Nie ma potrzeby ustawiania stałej wartości na NSLayoutConstraint
* Nie wymaga biblioteki innej firmy
* Nie wymaga kodu animacji
* Działa również w widoku tabeli
* To działa na Auto układ / auto zmiana rozmiaru
Dodaj to rozszerzenie UIResponder, aby dowiedzieć się, który TextField jest wybrany
Następnie użyj tego w dowolnym ViewController
Zarejestruj to powiadomienie w
func viewWillAppear(_ animated: Bool)
Wyrejestruj to powiadomienie w
func viewWillDisappear(_ animated:Bool)
Pobierz wersję demo tutaj
źródło
Dla Swift 3 stworzyłem podklasę UIViewController, ponieważ potrzebowałem stałego zachowania we wszystkich kontrolerach widoku.
źródło
Zweryfikowana odpowiedź nie uwzględnia pozycji pola tekstowego i zawiera pewne błędy (podwójne przesunięcie, nigdy nie wraca do pierwotnej pozycji, przesunięcie, nawet jeśli pole tekstowe znajduje się nad widokiem ...)
Chodzi o to:
wtedy będziemy mogli przesuwać widok tylko w razie potrzeby i określonego przesunięcia w odrze, aby skupić pole tekstowe tuż nad klawiaturą
Oto kod:
Szybki 4
}
źródło
Zauważyłem, że inne odpowiedzi obejmowały wycięcie części góry z widoku. Jeśli chcesz po prostu zmienić rozmiar widoku bez wycinania zawartości, po prostu spróbuj tej metody :)
źródło
Moje dwa centy dla początkujących: w powyższych próbkach ktoś zmienia współrzędne, inne używa „maski autoresize” i inne ograniczenia:
Jak mówi Apple, nie mieszaj tych 3 rodzajów logiki. Jeśli masz ograniczenia w Storyboard, nie próbuj zmieniać x / y. To zdecydowanie nie działa.
źródło
Więc żadna z pozostałych odpowiedzi nie wydaje się poprawna.
Klawiatura Good Behaviored na iOS powinna:
Mój kod używa
NSLayoutConstraint
deklarowanego jako@IBOutlet
Możesz także użyć transformacji, zobaczyć przesunięcia, .... Myślę, że łatwiej jest z ograniczeniem tho. Działa poprzez ustawienie ograniczenia na dole, może być konieczna zmiana kodu, jeśli twoja stała nie jest równa 0 / Not na dole.
Oto kod:
źródło
jego 100% idealna odpowiedź na wszystkie aktualizacje Guy's Tableview Height po otwarciu klawiatury
Dla Swift 4.2
Swift3.2
źródło
Dla Swift 3
źródło
Swift 4:
Miałem problem z najczęściej akceptowaną odpowiedzią, w której ukrywanie klawiatury nie przywracało widoku do końca strony (tylko częściowo). To zadziałało dla mnie (+ zaktualizowane dla Swift 4).
źródło
Podobne do odpowiedzi @ Boris, ale w Swift 5 :
źródło
Oto moje rozwiązanie (w rzeczywistości ten kod dotyczy przypadku, gdy masz niewiele pól tekstowych w widoku, działa to również w przypadku, gdy masz jedno pole tekstowe)
źródło
Zaktualizowano dla Swift 3 ...
Jak powiedzieli inni, musisz dodać obserwatorów powiadomień do metody viewDidLoad () kontrolera, tak jak to:
Pamiętaj, aby w razie potrzeby usunąć obserwatorów (robię to w metodzie viewWillDisappear ())
Następnie zaimplementuj metody pokazywania i ukrywania - zwróć uwagę na wiersz, który mówi aplikacji, aby ignorowała zdarzenia interakcji (beginIgnoringInteractionEvents). Jest to ważne, ponieważ bez niego użytkownik może dotknąć pola lub nawet widoku przewijania i spowodować, że zmiana nastąpi po raz drugi, co spowoduje straszną usterkę interfejsu użytkownika. Ignorowanie zdarzeń interakcji przed pokazywaniem i ukrywaniem klawiatury zapobiegnie temu:
Na koniec włącz ponownie interakcje użytkownika (pamiętaj, że ta metoda jest uruchamiana po tym, jak klawiatura didShow lub didHide):
źródło
Kod Swift 3
źródło
Jeśli masz 2 lub więcej pól tekstowych na tym samym VC, a użytkownik stuka w jedno z nich, a następnie w drugie, bez wywoływania funkcji keyboardWillHide, widok idzie jeszcze raz w górę, co nie jest konieczne, ponieważ będziesz mieć klawiaturę, puste miejsce, które ma wysokość klawiatury, a następnie widok, używając kodu w odpowiedzi, którą edytowałem:
Aby rozwiązać ten problem, zamień dwie funkcje „KeyboardWillShow / Hide” na następujące:
źródło
@ Rozwiązanie Borisa jest BARDZO dobre, ale widok może czasem być uszkodzony.
Aby uzyskać idealne wyrównanie, użyj poniższego kodu
Funkcje:
I,
źródło
ten samouczek wideo jest najlepszy. 7 minut i będzie to miało sens. Takie proste rozwiązanie, gdy masz wiele pól tekstowych i chcesz, aby widok przewijania przesuwał liczbę „x” pikseli po dotknięciu tego konkretnego pola tekstowego.
https://youtu.be/VuiPGJOEBH4
Tylko te kroki:
-Umieść wszystkie pola tekstowe w widoku przewijania ograniczonym do krawędzi widoku.
-Połącz wszystkie pola tekstowe i przewiń widok jako delegaci do kontrolera widoku.
-Połącz wszystkie pola tekstowe i przewiń widok za pomocą IBOutlet.
-Dodaj protokół UITextFieldDelegate do swojej klasy
-Dodaj metody UITextFieldDelegate do pliku szybkiego:
Pierwsza metoda po prostu aktywuje przycisk powrotu na klawiaturze, aby zwolnić klawiaturę. Drugim jest, gdy klikniesz w dowolne określone pole tekstowe, a następnie ustawisz przesunięcie y przesunięcia o ile przewijany jest twój scrollview (mój jest oparty na położeniu y na moich kontrolerach widoku 25,57,112,142). Ostatni mówi, że po stuknięciu z klawiatury widok przewijania wraca do pierwotnej lokalizacji.
W ten sposób mój piksel widoku jest idealny!
źródło
Ta funkcja Shuda została wbudowana w Ios, jednak musimy to zrobić na zewnątrz.
Wstaw poniższy kod
* Aby przenieść widok, gdy textField znajduje się pod klawiaturą,
* Nie przenosić widoku, gdy textField znajduje się nad klawiaturą
* Aby w razie potrzeby przenieść widok w oparciu o wysokość klawiatury.
To działa i przetestowano we wszystkich przypadkach.
| :: | Czasami widok będzie w dół, w takim przypadku użyj wysokości +/- 150:
źródło
musi być bardziej stabilny
źródło
źródło
Użyj następującego kodu, aby wyświetlić Up on UITextField Clicked
źródło
Zrobiłem cocoapod, aby uprościć sprawę:
https://github.com/xtrinch/KeyboardLayoutHelper
Jak tego użyć:
Stwórz dolne ograniczenie automatycznego układu, nadaj mu klasę KeyboardLayoutConstraint w module KeyboardLayoutHelper, a kapsuła wykona pracę niezbędną do jej zwiększenia, aby dostosować się do pojawiania się i znikania klawiatury. Zobacz przykładowy projekt z przykładami, jak go używać (zrobiłem dwa: pola tekstowe w scrollView i pola tekstowe pionowo wyśrodkowane z dwoma podstawowymi widokami - logowanie i rejestracja).
Dolne ograniczenie układu może dotyczyć widoku kontenera, samego pola tekstowego, cokolwiek, jak go nazwiesz.
źródło