Używam Swift do programowania w iOS i używam tego kodu do przenoszenia UITextField
, ale to nie działa. Wywołuję tę funkcję keyboardWillShow
poprawnie, ale pole tekstowe się nie porusza. Używam autolayout.
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}
deinit {
NSNotificationCenter.defaultCenter().removeObserver(self);
}
func keyboardWillShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
//let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
var frame = self.ChatField.frame
frame.origin.y = frame.origin.y - keyboardSize.height + 167
self.chatField.frame = frame
println("asdasd")
}
}
ios
swift
cocoa-touch
keyboard
uitextfield
Pedro Manfredi
źródło
źródło
Odpowiedzi:
Istnieje kilka ulepszeń w istniejących odpowiedziach.
Po pierwsze UIKeyboardWillChangeFrameNotification jest prawdopodobnie najlepszym powiadomieniem, ponieważ obsługuje zmiany, które nie są tylko pokazywanie / ukrywanie, ale zmiany spowodowane zmianami klawiatury (język, używanie klawiatur innych firm itp.) Oraz obrotami (ale uwaga poniżej uwaga wskazująca, że klawiatura się ukryje powinna obsługiwane również w celu obsługi sprzętowego połączenia klawiatury).
Po drugie, parametry animacji można wyciągnąć z powiadomienia, aby upewnić się, że animacje są odpowiednio połączone.
Prawdopodobnie istnieją opcje, aby wyczyścić ten kod nieco bardziej, szczególnie jeśli nie masz nic przeciwko rozpakowaniu kodu słownika.
Szybki 3
(Edytowane w celu uwzględnienia animacji klawiatury zamiast zmniejszania, zgodnie z niesamowitym komentarzem @ Gabox poniżej)
Szybki 5
źródło
endFrame?.size.height
nie ma wartości zero. Mam ramkę końcową jakUIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 1024}, {768, 264}}";
. Działa z iOS 8.3 iPad Simulator, Portrait. Xcode6.3 beta4..UIKeyboardWillChangeFrame
nie uruchamia się po podłączeniu klawiatury sprzętowej, nawet jeśli klawiatura iOS znika. Musisz również obserwować,.UIKeyboardWillHide
aby złapać ten przypadek krawędzi.Jeśli korzystasz z automatycznego układu, zakładam, że ustawiłeś dolną przestrzeń na ograniczenie Superview . W takim przypadku wystarczy zaktualizować wartość ograniczenia. Oto jak to zrobić przy odrobinie animacji.
Twarda 20 jest dodawana tylko po to, aby nieco przesunąć pole tekstowe nad klawiaturą. W przeciwnym razie dotykałby się górny margines klawiatury i dolny margines pola tekstowego.
Po zwolnieniu klawiatury zresetuj wartość ograniczenia do pierwotnej.
źródło
UIKeyboardWillShowNotification
powiadomienie. Spójrz na kod w pytaniu PO.animateWithDuration
i wywołajself.view.layoutIfNeeded()
wewnątrz bloku animacji.Prostym rozwiązaniem jest przesunięcie widoku w górę przy stałej wysokości klawiatury.
Swift 5:
źródło
self.view.frame.origin.y -= 150
useself.view.frame.origin.y = -150
i zamiastself.view.frame.origin.y += 150
useself.view.frame.origin.y = 0
. Zapobiega to przesunięciu widoku 150 za każdym razem, gdy dotknięte zostanie nowe pole.Aby przenieść widok podczas edycji pola tekstowego, spróbuj tego, zastosowałem to,
Opcja 1: - ** ** Aktualizacja w Swift 5.0 i iPhone X, XR, XS i XS Max Move za pomocą NotificationCenter
Zarejestruj to powiadomienie w
func viewWillAppear(_ animated: Bool)
Wyrejestruj to powiadomienie w
func viewWillDisappear(_ animated: Bool)
Uwaga: - Jeśli nie wyrejestrujesz się, to zadzwoni z klasy dziecięcej i będzie przyczyną awarii lub inaczej.
Opcja 2: - działa dobrze
Otrzymałem tę odpowiedź z tego źródła UITextField przesuń w górę, gdy klawiatura pojawia się w Swift
W Swift 4 ---
źródło
Uwielbiam czysty kod Swift. Oto najostrzejszy kod, jaki mogłem wymyślić, aby przesunąć widok tekstu w górę / w dół za pomocą klawiatury. Obecnie działa w aplikacji produkcyjnej Swift 2 dla systemu iOS8 / 9.
AKTUALIZACJA (marzec 2016): Właśnie zaostrzyłem mój poprzedni kod tak bardzo, jak to możliwe. Istnieje również wiele popularnych odpowiedzi, które zakodują na stałe wysokość klawiatury i parametry animacji. Nie ma takiej potrzeby, nie wspominając o tym, że liczby w tych odpowiedziach nie zawsze pokrywają się z rzeczywistymi wartościami, które widzę na moim 6s + iOS9 (wysokość klawiatury 226, czas trwania 0,25 i krzywa animacji 7). W każdym razie prawie żaden dodatkowy kod nie pozwala uzyskać tych wartości bezpośrednio z systemu. Patrz poniżej.
UWAGA: Ten kod obejmuje większość komentarzy / ogólnych przypadków. Jednak może być potrzebny więcej kodu do obsługi różnych orientacji i / lub niestandardowych klawiatur. Oto szczegółowy artykuł na temat pracy z klawiaturą iOS. Jeśli musisz obsłużyć każdy scenariusz, może to pomóc.
źródło
as
do użycia rzutów wymuszonych.as!
może działać, ale jak widać gdzie indziej na tej stronie, unikam wymuszania rzutów i wymuszania rozpakowywania.baseConstraint
może to byćbaseConstraint.constant = moveUp ? keyboardHeight : 0
zamiastbaseConstraint.constant = moveUp ? -keyboardHeight : 0
.Edycja : Polecam łatwiejsze i czystsze rozwiązanie. Wystarczy zmienić klasę ograniczenia odstępów na dole na KeyboardLayoutConstraint . Automatycznie powiększy się do wysokości klawiatury.
To ulepszona wersja odpowiedzi @JosephLord.
Testowany na iPadzie iOS 8.3, portret. Xcode6.3 beta4, zauważyłem, że jego odpowiedź nie działa, gdy ukrywa się klawiatura, ponieważ
UIKeyboardFrameEndUserInfoKey
jest"NSRect: {{0, 1024}, {768, 264}}";
. Wysokość nigdy nie jest0
.Powraca to do tradycyjnego
UIKeyboardWillShowNotification
iUIKeyboardWillHideNotification
lepszego rozpoznania, kiedy klawiatura się ukrywa, zamiast polegać na wysokości ramki końcowej.UIKeyboardWillShowNotification
jest również wysyłany po zmianie ramki klawiatury, więc powinien obejmować wszystkie przypadki użycia.źródło
pracuję z swift 4 i rozwiązałem ten problem bez żadnego dodatkowego ograniczenia na dole, spójrz mój kod jest tutaj. naprawdę działa w mojej sprawie
1) Dodaj obserwatora powiadomień w załadowano
2) Usuń Notification Observer jak
3) Dodaj metody pokazywania / ukrywania klawiatury, takie jak
4) Dodaj delegata textfeild i dodaj metody touchesBegan. Przydatne do ukrywania klawiatury, gdy dotkniesz poza tekstem na ekranie
źródło
UIKeyboardFrameEndUserInfoKey
NSNotification.Name.UIKeyboardWillShow
przemianowanoUIResponder.keyboardWillShowNotification
równieżUIKeyboardFrameBeginUserInfoKey
naUIResponder.keyboardFrameBeginUserInfoKey
To jest ulepszona wersja @JosephLord i odpowiedzi @ Hlung. Może mieć zastosowanie niezależnie od tego, czy masz pasek kart, czy nie. I idealnie przywróci widok, który jest przesuwany za pomocą klawiatury do pierwotnej pozycji.
źródło
Najłatwiejszy sposób, który nie wymaga żadnego kodu:
Obiekt automatycznie przesunie się w górę za pomocą klawiatury, w synchronizacji.
źródło
Stworzyłem protokół Swift 3 do obsługi wyglądu / znikania klawiatury
Następnie, aby zaimplementować go w UIViewController, wykonaj następujące czynności:
niech viewController jest zgodny z tym protokołem:
zacznij obserwować zmiany klawiatury w widoku
przestań obserwować zmiany klawiatury w widoku
utwórz IBOutlet dla dolnego ograniczenia z scenorysu:
(Zalecam osadzenie całego interfejsu użytkownika w „contentView” i połączenie z tą właściwością dolnego ograniczenia z contentView do dolnego przewodnika po układzie)
zmień priorytet ograniczenia górnego ograniczenia na 250 (niski)
Pozwala to na przesuwanie całego widoku w górę, gdy pojawia się klawiatura. Priorytet musi być niższy niż jakikolwiek inny priorytet ograniczenia w widokach podrzędnych, w tym priorytety przytulania treści / priorytety odporności na kompresję treści.
W tym celu może być konieczne dodanie ograniczenia „większego niż równego”:
I proszę bardzo!
źródło
import UIKit
Można zastosować takie proste
UIViewController
rozszerzeniePrzykład użycia
Rozwiązanie Swift 4
Szybki 4.2
źródło
removeKeyboardObserver()
Metoda tutaj faktycznie nie usunąć obserwatora. Jeśli nie wywołasz tego, zobaczyszInvalid conditions for UIKeyboardWillChangeFrameNotification
w konsoli symbol z metody add. Jeśli nazwiesz to, zobaczysz ten sam błąd, co oznacza, że obserwator nie zostanie usunięty. Dokumentacja mówi „Aby wyrejestrować obserwacje, przekazujesz obiekt zwrócony tą metodą doremoveObserver(_:)
”. Zamiast tego zapisz obiekt zwrócony tą metodą, a następnie przekaż go, gdy chcesz usunąć obserwatora.Możesz użyć tej biblioteki i tylko jednego wiersza kodu w appDidFinishedLaunching i gotowe.
IQKeyboardManager - dostosuj widok za każdym razem, gdy pojawi się klawiatura - link - https://github.com/hackiftekhar/IQKeyboardManager
źródło
I wreszcie, ponieważ używamy metod delegatów
zrefaktoryzowano z użycia celu-c http://www.cocoawithlove.com/2008/10/sliding-uitextfields-around-to-avoid.html
źródło
var animateDistance: CGFloat!
plus, że musiałem obsługiwać UIKeyboardWillHideNotification, gdy użytkownik naciska przycisk ukrywania klawiatury.Inne rozwiązanie, które nie zależy od autolayout, ograniczeń lub jakichkolwiek gniazd. Potrzebujesz tylko swoich pól w widoku przewijania.
źródło
UIKeyboardWillShowNotification
wywołaniu.Oto moja wersja rozwiązania dla Swift 2.2:
Najpierw zarejestruj się, aby wyświetlać / ukrywać powiadomienia z klawiatury
Następnie w metodach odpowiadających tym powiadomieniom przesuń widok główny w górę lub w dół
Sztuką jest część „keyboardWillShow”, która odbiera połączenia za każdym razem, gdy „Pasek sugestii QuickType” jest rozwinięty lub zwinięty. Następnie zawsze ustawiamy współrzędną y głównego widoku, która jest równa ujemnej wartości całkowitej wysokości klawiatury (z częścią paska „QuickType” lub bez).
Na koniec nie zapomnij usunąć obserwatorów
źródło
Poniżej przedstawiono proste rozwiązanie, w którym pole tekstowe ma ograniczenie wiążące je z dolnym przewodnikiem układu. Po prostu dodaje wysokość klawiatury do stałej ograniczenia.
źródło
Cóż, myślę, że mogę się spóźnić, ale znalazłem inną prostą wersję odpowiedzi Saqiba. Używam autolayout z ograniczeniami. Mam mały widok innego widoku głównego z polami nazwy użytkownika i hasła. Zamiast zmieniać współrzędną y widoku zapisuję oryginalną wartość ograniczenia w zmiennej i zmieniam stałą ograniczenia na pewną wartość i ponownie po zwolnieniu klawiatury, konfiguruję ograniczenie do pierwotnej. W ten sposób unika się problemu, jaki ma odpowiedź Saqiba: (widok ciągle się przesuwa i nie zatrzymuje się). Poniżej znajduje się mój kod ...
źródło
Szybka odpowiedź 4.x, łącząca odpowiedzi @Joseph Lord i @Isuru.
bottomConstraint
reprezentuje dolne ograniczenie widoku, który chcesz przenieść.źródło
Zrobiłem to w następujący sposób:
Jest to przydatne, gdy podglądem pola tekstowego jest widok
źródło
źródło
Zrobiłem w następujący sposób:
źródło
Jeśli jesteś podobny do mnie, który wypróbował wszystkie powyższe rozwiązania, a mimo to Twój problem nie został rozwiązany, mam dla Ciebie świetne rozwiązanie, które działa jak urok. Najpierw chcę wyjaśnić kilka rzeczy na temat niektórych wyżej wymienionych rozwiązań.
źródło
Oto ogólne rozwiązanie dla wszystkich kroków TextField -
1) Utwórz wspólny ViewController, który jest rozszerzony przez inne ViewController
2) Utwórz rozszerzenie UIViewController i aktualnie aktywny TextField
rozszerzenie UIViewController {func getSelectedTextField () -> UITextField? {
}
źródło
Bardzo proste i nie trzeba więcej kodować. Po prostu dodaj
pod 'IQKeyboardManagerSwift'
swój plik pod, a naAppDelegate
stronie dodaj kod poniżej.i w
didFinishLaunchingWithOptions()
typie metodyto jest to. sprawdź ten link wideo, aby lepiej zrozumieć https://youtu.be/eOM94K1ZWN8 Mam nadzieję, że to ci pomoże.
źródło
Kompletny kod do zarządzania klawiaturą.
źródło
Trochę zmodyfikowałem rozwiązanie @Simpa .........
źródło
Żadne z nich nie działało i skończyło się to na wstawianiu zawartości, aby przesunąć mój widok w górę, gdy pojawia się klawiatura.
Uwaga: korzystałem z UITableView
Referenced solution @ keyboard-content-offset które zostało w całości napisane w celu C, poniższe rozwiązanie jest czyste Swift.
Dodaj obserwatora powiadomień @ viewDidLoad ()
Aby uzyskać rozmiar klawiatury, najpierw uzyskujemy słownik userInfo z obiektu powiadomienia, który przechowuje wszelkie dodatkowe obiekty, których może używać nasz odbiornik.
Z tego słownika możemy uzyskać obiekt CGRect opisujący ramkę klawiatury za pomocą klawisza UIKeyboardFrameBeginUserInfoKey.
Zastosuj wstawkę zawartości do metody widoku tabeli @ keyboardWillBeShown,
Przywróć metodę view @ keyboardWillBeHidden
Jeśli chcesz również uwzględnić orientację urządzenia, użyj instrukcji warunkowych, aby dostosować kod do swoich potrzeb.
źródło
źródło
Rozwiązanie Swift 4, z którego korzystam, ma wielkość klawiatury. Zamień na
serverStatusStackView
dowolny widok, na którym ci zależy, np .self.view
:źródło
Najlepszym sposobem jest użycie NotificationCenter do przechwytywania akcji klawiatury. Możesz wykonać czynności opisane w tym krótkim artykule https://medium.com/@demirciy/keyboard-handling-deb1a96a8207
źródło