Mam aplikację, w której w Interface Builder skonfigurowałem UIView
pole tekstowe w dolnej części widoku. Kiedy uruchamiam aplikację i próbuję wprowadzić tekst w tym polu, klawiatura przesuwa się nad pole, więc nie widzę, co piszę, dopóki ponownie nie ukryję klawiatury.
Czy ktoś inny napotkał ten problem i znalazł dobry sposób rozwiązania go bez przewijania widoku rodzica lub przesuwania pola tekstowego dalej w górę ekranu?
ios
iphone
keyboard
uitextfield
Cruinh
źródło
źródło
Odpowiedzi:
Typowym rozwiązaniem jest przesunięcie pola (i wszystkiego nad nim) w górę z animacją, a następnie z powrotem w dół, gdy skończysz. Może być konieczne umieszczenie pola tekstowego i niektórych innych elementów w innym widoku i przesunięcie widoku jako jednostki. (Nazywam te rzeczy „płytami” jak „płytami tektonicznymi”, ale to tylko ja). Ale tutaj jest ogólny pomysł, jeśli nie potrzebujesz fantazji.
źródło
To zdziałało cuda dla mnie przesuwające się pola uitextfields
W szczególności ma tę zaletę, że oblicza odległość animacji slajdu w zależności od położenia pola tekstowego.
źródło
IQKeyboardManager zrobi to za Ciebie BEZ LINII KODU , wystarczy przeciągnąć i upuścić powiązany plik źródłowy do projektu. IQKeyboardManager obsługuje również orientację urządzenia , automatyczne zarządzanie paskiem narzędzi UIT , keyboardDistanceFromTextField i znacznie więcej niż myślisz.
Oto schemat kontroli:
Krok 1: - Dodano powiadomienia o globalne
UITextField
,UITextView
orazUIKeyboard
w klasie singleton. Nazwałem to IQKeyboardManager .Krok 2: - W przypadku stwierdzenia
UIKeyboardWillShowNotification
,UITextFieldTextDidBeginEditingNotification
czyUITextViewTextDidBeginEditingNotification
powiadomień, a następnie postarać się otopMostViewController
wystąpienie zUIWindow.rootViewController
hierarchii. Aby prawidłowo ją odsłonićUITextField
/UITextView
na niejtopMostViewController.view
należy wyregulować ramkę.Krok 3: - Obliczona oczekiwana odległość ruchu
topMostViewController.view
w odniesieniu do pierwszej odpowiedziUITextField
/UITextView
.Krok 4: - Przesunięto w
topMostViewController.view.frame
górę / w dół zgodnie z oczekiwaną odległością ruchu.Krok 5: - W przypadku stwierdzenia
UIKeyboardWillHideNotification
,UITextFieldTextDidEndEditingNotification
czyUITextViewTextDidEndEditingNotification
zgłoszenie, a następnie ponownie spróbować uzyskaćtopMostViewController
wystąpienie zUIWindow.rootViewController
hierarchii.Krok 6: - Obliczona zakłócona odległość,
topMostViewController.view
którą należy przywrócić do pierwotnej pozycji.Krok 7: - Przywrócenie
topMostViewController.view.frame
zgodnie z zakłóconą odległością.Krok 8: - Utworzono instancję pojedynczej instancji klasy IQKeyboardManager podczas ładowania aplikacji, więc każde
UITextField
/UITextView
w aplikacji dostosuje się automatycznie zgodnie z oczekiwaną odległością ruchu.To wszystko
źródło
Aby rozwinąć odpowiedź Amagrammera, oto przykładowa klasa:
LoginViewController.h
Zauważ, że implementujemy „UITextFieldDelegate”
LoginViewController.m
źródło
UIApplicationDidEnterBackgroundNotification
, w przeciwnym razie przesunie się bardziej w dół, jeśli naciśniesz przycisk Home i ponownie wejdziesz do aplikacji, powodując, że będzie brzydka i błędna.A co z oficjalnym rozwiązaniem: przenoszeniem treści umieszczonych pod klawiaturą
źródło
Mam ten sam problem w
UITableView
komórkach textField. Rozwiązuję ten problem, wdrażając następującą metodę odsłuchiwania powiadomienia z klawiatury.Obserwator powiadomień tutaj:
Obsługuj te powiadomienia, korzystając z poniższej funkcji:
źródło
Sprawdź to. Nie ma dla ciebie kłopotów.
To bardzo fajne rozwiązanie. Wszystko, co musisz zrobić, to dodać pola tekstowe w a
UIScrollView
i zmienić jego klasę naTPKeyboardAvoidingScollView
, jeśli używasz scenorysów. Widok przewijania jest rozszerzony w taki sposób, że wykrywałby widoczność klawiatury i przesuwał się nad klawiaturą w rozsądnej odległości. Jest to idealne rozwiązanie, ponieważ jest niezależne od TwojegoUIViewController
. Wszystko, co niezbędne, jest wykonywane w ramach wyżej wymienionej klasy. Dzięki Michael Tyson i wszystkim.TPKeyboard Unikanie
źródło
Poniżej znajduje się szybka wersja odpowiedzi Amagrammera. Również odmiana wykorzystująca zdarzenie UIKeyboardWillShowNotification, ponieważ potrzebowałem znać rozmiar klawiatur przed przeniesieniem widoku z drogi.
źródło
Był świetny przewodnik po edytowaniu pól tekstowych bez zasłaniania (link martwy, tutaj jest link Wayback: https://web.archive.org/web/20091123074029/http://acts-as-geek.blogspot.com/2009/ 11 / edit-textfields-without-obscuring.html ). Pokazuje, jak przenieść istniejący
UIView
do aUIScrollView
i przewijać go automatycznie, gdy pojawi się klawiatura.Zaktualizowałem go nieco, aby obliczyć prawidłową wysokość dla
UIScrollView
kontrolek (takich jak aUITabBar
) poniżejUIScrollBar
. Zobacz post aktualizujący uiview .źródło
Oto rozwiązanie wykorzystujące Xcode5, iOS7:
Użyj bloków UITextfieldDelegate i animacji.
To jest prawie cały kod dla ViewController, ale chciałem dołączyć kod delegata dla tych, którzy wciąż nie znają wzorca delegata (jak ja). Dołączyłem również kod, aby ukryć klawiaturę po dotknięciu z dala od widoku tekstu.
Możesz przesuwać widoki (przyciski, pola tekstowe itp.) Tak wysoko, jak chcesz, po prostu pamiętaj, aby umieścić je z powrotem na miejscu (+100, a następnie -100).
źródło
Myślę, że jednym ze sposobów byłoby przesunięcie całej pozycji widoku z (x, y) do (x, y-keybaardHeight) po kliknięciu pola tekstowego i umieszczenie go z powrotem po zamknięciu klawiatury, może wyglądać trochę dziwnie, ponieważ widok po prostu pojawi się (może nie byłoby źle, gdybyś go animował).
źródło
Oprócz rozwiązania Amagrammera, jeśli używasz cocos2d w trybie portretowym, zmień tę linię:
do tego:
Jeśli używasz cocos2d w trybie poziomym, dokonaj powyższej zmiany i przełącz
up
wartości wtextFieldDidBeginEditing:
itextFieldDidEndEditing:
źródło
Miałem ten sam problem i stwierdziłem, że GTKeyboardHelper jest łatwym wyjściem.
Po przeciągnięciu i upuszczeniu struktury w projekcie, dołącz plik nagłówkowy. Pobierz i otwórz przykładowy projekt, a następnie przeciągnij obiekt „Pomocnik klawiatury” z sekcji obiektów w xib do sekcji obiektów w kreatorze interfejsów projektu.
Przeciągnij i upuść wszystkie swoje widoki, aby być dziećmi „Pomocnika klawiatury”.
źródło
Przeciągnij i upuść framework, którego używam w moich projektach. Obsługuje automatyczne zwalnianie po dotknięciu poza pierwszą osobą reagującą lub podczas przewijania.
GTKeyboardHelper
źródło
Po prostu przesuń widok w górę iw dół, jeśli to konieczne:
Nie zapomnij ustawić
self
jakoUITextFieldDelegate
i jako rzeczywistego pola tekstowegodelegate
.(Dzięki Ammagrammer to po prostu krótsza odpowiedź wykorzystująca bloki do animacji)
źródło
Mam coś innego, jeśli chcesz. Chodzi o to, że chcesz ustawić środek UIView na polu tekstowym, które edytujesz.
Wcześniej musisz zapisać swoje INITIAL_CENTER jako CGPoint z self.view.center i INITIAL_VIEW jako CGRect z self.view.frame we właściwości const.
Możesz utworzyć taką metodę:
Następnie na swoim UITextFieldDelegate musisz zadzwonić do centrum telefonicznegoOn : (CGRect) w następujących metodach:
textFieldDidBeginEditing: (UITextField *) z parametrem ramką pola tekstowego, na którym chcesz wyśrodkować.
I musisz to wywołać w swoim programie obsługi zdarzeń, gdzie zamykasz klawiaturę,
textFieldDidEndEditing: (UITextField *) może być jednym ze sposobów, aby to zrobić, umieszczając INITIAL_VIEW jako parametr centerOn: (CGRect) .
źródło
Uważam, że w nowszych wersjach iOS (6.1+, być może nawet wcześniej), podstawowy widok, przynajmniej dla UITableView, automatycznie się zmniejsza, gdy pojawia się klawiatura. Musisz więc tylko pokazać pole tekstowe w tym widoku. W
init
:następnie:
źródło
https://github.com/ZulwiyozaPutra/Shift-Keyboard-Example Mam nadzieję, że to rozwiązanie pomogło. Wszystkie są napisane w języku Swift 3.
źródło