Następnie użyłem następującego kodu w keyboardOnScreen:celu uzyskania dostępu do ramki klawiatury. Ten kod pobiera userInfosłownik z powiadomienia, a następnie uzyskuje dostęp do NSValueskojarzonego z UIKeyboardFrameEndUserInfoKey. Następnie możesz uzyskać dostęp do CGRect i przekonwertować go na współrzędne widoku kontrolera widoku. Stamtąd możesz wykonać dowolne obliczenia na podstawie tej ramki.
Chociaż wydaje się to trochę skomplikowane, jest to z pewnością lepsze niż zakodowanie rozmiaru klawiatury. Poprawna odpowiedź.
n13
2
Zagłosowano na tę odpowiedź i zagłosowano w dół na pytanie. OP zdecydowanie nie wie, o czym mówi. Uważajcie! Ta odpowiedź jest prawidłowa!
superarts.org
2
jedno uzupełnienie dla Landscape: if (SYSTEM_VERSION_LESS_THAN (@ "8.0")) {_keyboardHeight = keyboardFrame.size.width; } else {_keyboardHeight = keyboardFrame.size.height; }
LiangWang
3
Czy można to zrobić bez konieczności wyświetlania klawiatury? W moim przypadku chcę mieć coś za klawiaturą o tej samej wysokości (podobnie jak posłańcy mają rzeczy)
John
@ superarts.org Nie ma potrzeby głosowania przeciw pytaniu; ludzie najprawdopodobniej będą szukać tego, a teraz zobaczą tę odpowiedź ... więc wszystko jest w porządku :)
Ja͢ck
46
Pamiętaj, że w systemie iOS 8 rozmiar klawiatury ekranowej może się różnić. Nie zakładaj, że klawiatura ekranowa zawsze będzie widoczna (o określonej wysokości) lub niewidoczna.
Teraz, z iOS 8, użytkownik może także przesunąć palcem obszar tekstu przewidywania i wyłączać ... i kiedy to zrobić, to skopać danej aplikacji keyboardWillShowzdarzenie ponownie .
To to zerwanie wielu starszych przykładów kodu, które zalecały napisanie keyboardWillShowzdarzenia, które po prostu mierzy bieżącą wysokość klawiatury ekranowej i przesuwanie elementów sterujących w górę lub w dół na stronie o tę (bezwzględną) wartość.
Innymi słowy, jeśli zobaczysz przykładowy kod, który po prostu mówi, aby dodać keyboardWillShowzdarzenie, zmierzyć wysokość klawiatury, a następnie zmienić wysokość kontrolek o tę wartość, to nie zawsze będzie działać.
W powyższym przykładzie użyłem przykładowego kodu z poniższej witryny, która animuje constantwartość ograniczeń pionowych .
W mojej aplikacji dodałem ograniczenie do mojego UITextView, ustawionego u dołu ekranu. Kiedy ekran pojawił się po raz pierwszy, zapisałem tę początkową odległość w pionie.
Następnie za każdym razem, gdy moje keyboardWillShowzdarzenie zostanie uruchomione, dodaję (nową) wysokość klawiatury do tej oryginalnej wartości ograniczenia (więc ograniczenie zmienia wysokość kontrolki).
Tak. Jest brzydki.
I jestem trochę zirytowany / zaskoczony, że strasznie bolesny układ AutoLayout XCode 6 nie pozwala nam tylko na podłączenie spodów elementów sterujących do dolnej części ekranu lub górnej części klawiatury ekranowej.
w rzeczywistości rozmiar klawiatury zawsze się różni, nawet w starszych wersjach iOS. np. sprawdź pismo odręczne w języku chińskim
ponowne wykrywanie
Ups, nie zdawałem sobie z tego sprawy. Po prostu wydało mi się to dziwne, że tak wiele próbek "keyboardWillShow" zawsze zakładało, że to zdarzenie zostanie wywołane tylko raz, gdy klawiatura pojawi się lub zniknie ... bez funkcji radzenia sobie z pozostawaniem klawiatury na ekranie, ale ze zmianą jej rozmiaru.
Mike Gledhill
1
@MikeGledhill Myślę, że powinieneś użyć "UIKeyboardWillChangeFrameNotification" do zmiany ramki z powodu obrotu lub pokazania (/ ukrycia) paska przewidywania tekstu ...
Abdalrahman Shatou
Właśnie przetestowałem to w mojej aplikacji. UIKeyboardWillChangeFrameNotification zawsze jest wywoływana RÓWNIEŻ JAK zdarzenie keyboardWillShow, za każdym razem, gdy wyświetlam klawiaturę lub włączam lub wyłączam obszar przewidywania tekstu. Więc to tak naprawdę nie pomaga. Chodzi mi o to, że ... użytkownicy muszą być trochę ostrożni z tymi wydarzeniami, to wszystko.
Mike Gledhill
1
Dlaczego nie poświęca się temu dużo więcej uwagi?
rfoo
30
Wysokość klawiatury wynosi 216 punktów dla trybu pionowego i 162 punktów dla trybu poziomego.
Jeśli masz zamiar publikować pytania, na które odpowiedziano samodzielnie, udziel przynajmniej przyzwoitych odpowiedzi. Rozmiar klawiatury należy pobrać z obiektu powiadomienia, a nie zakodowaną na stałe wartość pobraną z jakiejś strony internetowej. Zobacz tutaj
jrturton
16
@jrturton Nie chodzi o to, jak znaleźć wysokość programowo. To pytanie jest przydatne nie tylko dla programistów, ale także dla grafików i tym podobnych. Odpowiedź, o którą prosisz, należy do innego pytania. W rzeczywistości jest jeszcze jedno pytanie z tą odpowiedzią: stackoverflow.com/a/7302291/310121
Erik B
48
@ErikB Bądź ostrożny. Rozmiar klawiatury zależy od języka i typu klawiatury.
Gabriel
13
Dla własnego dobra NIGDY nie używaj wartości zakodowanej na stałe! Jako mocny przykład, użytkownik może używać podzielonej (dwuczęściowej) klawiatury, która nie przejmuje się zbytnio wysokością.
Timo
6
Ta odpowiedź jest leniwa i niebezpieczna. Uzyskaj wysokość klawiatury z UIKeyboardDidShowNotification, ponieważ rzeczywista wartość zmienia się między głównymi wersjami iOS. Zobacz odpowiedź Kena poniżej.
Alexander
16
Uwaga do wersji: nie ma to już znaczenia w iOS 9 i 10, ponieważ obsługują one niestandardowe rozmiary klawiatury.
Odpowiedzi:
Użyłem następującego podejścia do określenia ramki klawiatury w iOS 7.1.
W metodzie init mojego kontrolera widoku zarejestrowałem się w
UIKeyboardDidShowNotification
:NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center addObserver:self selector:@selector(keyboardOnScreen:) name:UIKeyboardDidShowNotification object:nil];
Następnie użyłem następującego kodu w
keyboardOnScreen:
celu uzyskania dostępu do ramki klawiatury. Ten kod pobierauserInfo
słownik z powiadomienia, a następnie uzyskuje dostęp doNSValue
skojarzonego zUIKeyboardFrameEndUserInfoKey
. Następnie możesz uzyskać dostęp do CGRect i przekonwertować go na współrzędne widoku kontrolera widoku. Stamtąd możesz wykonać dowolne obliczenia na podstawie tej ramki.-(void)keyboardOnScreen:(NSNotification *)notification { NSDictionary *info = notification.userInfo; NSValue *value = info[UIKeyboardFrameEndUserInfoKey]; CGRect rawFrame = [value CGRectValue]; CGRect keyboardFrame = [self.view convertRect:rawFrame fromView:nil]; NSLog(@"keyboardFrame: %@", NSStringFromCGRect(keyboardFrame)); }
Szybki
I równoważna implementacja w Swift:
NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil) @objc func keyboardDidShow(notification: Notification) { guard let info = notification.userInfo else { return } guard let frameInfo = info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return } let keyboardFrame = frameInfo.cgRectValue print("keyboardFrame: \(keyboardFrame)") }
źródło
Pamiętaj, że w systemie iOS 8 rozmiar klawiatury ekranowej może się różnić. Nie zakładaj, że klawiatura ekranowa zawsze będzie widoczna (o określonej wysokości) lub niewidoczna.
Teraz, z iOS 8, użytkownik może także przesunąć palcem obszar tekstu przewidywania i wyłączać ... i kiedy to zrobić, to skopać danej aplikacji
keyboardWillShow
zdarzenie ponownie .To to zerwanie wielu starszych przykładów kodu, które zalecały napisanie
keyboardWillShow
zdarzenia, które po prostu mierzy bieżącą wysokość klawiatury ekranowej i przesuwanie elementów sterujących w górę lub w dół na stronie o tę (bezwzględną) wartość.Innymi słowy, jeśli zobaczysz przykładowy kod, który po prostu mówi, aby dodać
keyboardWillShow
zdarzenie, zmierzyć wysokość klawiatury, a następnie zmienić wysokość kontrolek o tę wartość, to nie zawsze będzie działać.W powyższym przykładzie użyłem przykładowego kodu z poniższej witryny, która animuje
constant
wartość ograniczeń pionowych .Ćwiczenie autoukładu
W mojej aplikacji dodałem ograniczenie do mojego
UITextView
, ustawionego u dołu ekranu. Kiedy ekran pojawił się po raz pierwszy, zapisałem tę początkową odległość w pionie.Następnie za każdym razem, gdy moje
keyboardWillShow
zdarzenie zostanie uruchomione, dodaję (nową) wysokość klawiatury do tej oryginalnej wartości ograniczenia (więc ograniczenie zmienia wysokość kontrolki).Tak. Jest brzydki.
I jestem trochę zirytowany / zaskoczony, że strasznie bolesny układ AutoLayout XCode 6 nie pozwala nam tylko na podłączenie spodów elementów sterujących do dolnej części ekranu lub górnej części klawiatury ekranowej.
Może czegoś mi brakuje.
Poza moim zdrowiem psychicznym.
źródło
Wysokość klawiatury wynosi 216 punktów dla trybu pionowego i 162 punktów dla trybu poziomego.
Źródło
źródło
Uwaga do wersji: nie ma to już znaczenia w iOS 9 i 10, ponieważ obsługują one niestandardowe rozmiary klawiatury.
Zależy to od modelu i paska QuickType:
http://www.idev101.com/code/User_Interface/sizes.html
źródło
Wysokość klawiatury zależy od modelu, paska QuickType, ustawień użytkownika ... Najlepszym podejściem jest obliczenie dynamiczne:
Swift 3.0
var heightKeyboard : CGFloat? override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardShown(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil) } func keyboardShown(notification: NSNotification) { if let infoKey = notification.userInfo?[UIKeyboardFrameEndUserInfoKey], let rawFrame = (infoKey as AnyObject).cgRectValue { let keyboardFrame = view.convert(rawFrame, from: nil) self.heightKeyboard = keyboardFrame.size.height // Now is stored in your heightKeyboard variable } }
źródło
Nie mogę znaleźć ostatniej odpowiedzi, więc sprawdzam wszystko na symulatorze. (IOS 11.0)
Urządzenie | Wysokość ekranu | Portret | Krajobraz
iPhone 4s | 480,0 | 216,0 | 162,0
iPhone 5, iPhone 5s, iPhone SE | 568,0 | 216,0 | 162,0
iPhone 6, iPhone 6s, iPhone 7, iPhone 8, iPhone X | 667,0 | 216,0 | 162,0
iPhone 6 plus, iPhone 7 plus, iPhone 8 plus | 736,0 | 226,0 | 162,0
iPad 5.generacji, iPad Air, iPad Air 2, iPad Pro 9.7, iPad Pro 10.5, iPad Pro 12.9 | 1024,0 | 265,0 | 353,0
Dzięki!
źródło
iPhone
Rozmiary klawiatury:
2.6S, 6,7,8: (375 × 667): keyboardSize = (0.0, 407.0, 375.0, 260.
3.6 +, 6S +, 7+, 8+: (414 × 736) keyboardSize = (0.0, 465.0, 414.0, 271.0)
4.XS, X: (375 X 812) keyboardSize = (0.0, 477.0, 375.0, 335.0)
5.XR, XSMAX ((414 x 896) keyboardSize = (0.0, 550.0, 414.0, 346.0)
źródło