Wysokość w pionie i wysokość w poziomie mierzona w punktach.
Wysokość w pionie i wysokość w poziomie mierzona w punktach.
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 pobiera userInfo
słownik z powiadomienia, a następnie uzyskuje dostęp do NSValue
skojarzonego 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.
-(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)")
}
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 .
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.
Wysokość klawiatury wynosi 216 punktów dla trybu pionowego i 162 punktów dla trybu poziomego.
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:
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
}
}
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!
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)