Korzystałem z powiadomień klawiatury bez problemu i uzyskiwałem dokładną wysokość klawiatury.
- (void)keyboardDidShow:(NSNotification *) notification{
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
NSLog(@"%f",keyboardSize.height);}
ale w iOS 11 rozmiar klawiatury wynosi 0, gdy wywoływane jest powiadomienie.
Jaki problem występuje w tym scenariuszu? Używam Xcode 9 Beta 5
Zastąpić
UIKeyboardFrameBeginUserInfoKey
z
UIKeyboardFrameEndUserInfoKey
Poniższe pochodzi z Apple Docs.
źródło
Spróbuj tego:
wymienić
UIKeyboardFrameBeginUserInfoKey
zUIKeyboardFrameEndUserInfoKey
źródło
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
keyboardWillChangeFrame metoda: jest nie tylko uruchomić raz, może dwa razy, lub more.Maybe niektóre klawiatury mają specjalny pasek na górze czasami metoda będzie działać wiele razy w tym time.So, należy wymienić UIKeyboardFrameBeginUserInfoKey z UIKeyboardFrameEndUserInfoKey aby uzyskać ostateczną klatkę klawiatura.Miałem podobny problem, używając Xcode w wersji 9.0 (9A235); chociaż używałem Swift. W mojej metodzie keyboardWillShow napisałem:
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { let heightValue = keyboardSize.height ... }
O dziwo, przy pierwszym wywołaniu keyboardWillShow heightValue wynosiła 216.0, ale podczas kolejnych wywołań wynosiła 0! Być może jest to błąd Xcode.
Zastąpiłem UIKeyboardFrameBeginUserInfoKey kluczem UIKeyboardFrameEndUserInfoKey i rozwiązałem problem.
źródło
Ten problem występuje w systemie iOS 11.
Kod celu C:
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
Swift 2.3:
let keyboardSize = (NfnPsgVar.userInfo![UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue().size
Swift 3:
let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
źródło
Oblicz wysokość klawiatury za pomocą poniższego kodu.
Kod:
@objc func keyboardWillShow(notification: Notification) { guard let keyboardFrame = notification.userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return } let keyboardHeight: CGFloat if #available(iOS 11.0, *) { let window = UIApplication.shared.keyWindow let bottomPadding = window?.safeAreaInsets.bottom ?? 0.0 keyboardHeight = keyboardFrame.cgRectValue.height - bottomPadding } else { keyboardHeight = keyboardFrame.cgRectValue.height } }
źródło
Twoje podejście polega na uzyskaniu wysokości ramy, zanim zostanie wyświetlona, i dlatego powinna wynosić 0, co nie wiem, dlaczego tak nie jest za pierwszym razem! Oto przykład, jak poprawnie uzyskać wysokość klawiatury w Swift 4.2:
func keyboardWillShow(notification: Notification) { guard let userInfo = notification.userInfo else { return } guard var keyboardFrame: CGRect = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return } keyboardFrame = view.convert(keyboardFrame, from: nil) let keyboardHeight = keyboardFrame.height }
To poprawnie zapewni właściwości ramki klawiatury PRZED pojawieniem się klawiatury.
źródło