iOS 11 - Klavye yüksekliği, klavye bildiriminde 0 değerini döndürüyor


84

Klavye bildirimlerini sorunsuz bir şekilde kullanıyorum ve Klavyenin tam yüksekliğini alıyorum.

- (void)keyboardDidShow:(NSNotification *) notification{
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    NSLog(@"%f",keyboardSize.height);}

ancak iOS 11 ile bildirim çağrıldığında klavye boyutu 0'dır.

Bu senaryoda ortaya çıkan sorun nedir? Xcode 9 Beta 5 kullanıyorum

Yanıtlar:


190

Bunu kullan:

CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

Swift için şunları kullanabilirsiniz:

let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size


1
Teşekkürler, bunu asla düşünmezdim
Ammar Hadzic

5
UIKeyboardFrameBeginUserInfoKey'den UIKeyboardFrameEndUserInfoKey'e değiştirmek hile yaptı, thx.
user2408952

Teşekkürler, yarım gün yatırım yaptım ama çözemedim. diğer yarım günümü kurtardığın için teşekkürler.
Manish Nahar

@Akshay Sadece ilgili ekran sınırları içinde klavyenin başlangıç ​​ve bitiş çerçevesini başlatın.
s.zainulabideen

102

Değiştir UIKeyboardFrameBeginUserInfoKey

ile

UIKeyboardFrameEndUserInfoKey

Aşağıdakiler Apple Docs'tan alınmıştır.

UIKeyboardFrameBeginUserInfoKey- Ekran koordinatlarında klavyenin başlangıç ​​karesini tanımlayan bir CGRect içeren NSValue nesnesinin anahtarı.

UIKeyboardFrameEndUserInfoKey - Ekran koordinatlarında klavyenin bitiş çerçevesini tanımlayan bir CGRect içeren NSValue nesnesinin anahtarı.


13
Apple'ın örnek kodunu daha sonra güncellemesi gerekir, çünkü artık iOS 11'de çalışmaz. Ayrıca UIKeyboardFrameBeginUserInfoKey kullandıkları Apple belgelerinden: developer.apple.com/library/content/documentation/…
wildcat12

Sorunumu çözdüm! Tavsiye için teşekkürler!
Ernie

Birisi bana 5 yaşında gibi bir açıklama yapabilir mi, bu ikisi arasındaki farkın ne olduğunu ve UIScrollView'in otomatik olarak kaydırılması söz konusu olduğunda bunun neden fark yarattığını? Gerçekten minnettar olurum. Teşekkürler!
Mario

NumPad ile bir metin alanına dokunduktan sonra çalışmıyor. numPad'den sonra genel metin alanına dokunursam, klavye artık yukarı değil ve görünümü kapattığında aşağı in
Jack Daniel

7

Bunu dene:

Değiştir UIKeyboardFrameBeginUserInfoKeyileUIKeyboardFrameEndUserInfoKey


1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];yöntem keyboardWillChangeFrame: Sadece belki iki kez, bir kez çalıştırmak değildir veya more.Maybe bazı klavye bazen üstünde özel araç çubuğu, bu time.so birçok kez çalışacak yöntem, değiştirmek gerekir UIKeyboardFrameBeginUserInfoKey ile UIKeyboardFrameEndUserInfoKey son karesini almak klavye.
SolinLiu

5

Xcode Sürüm 9.0 (9A235) kullanırken benzer bir sorun yaşadım; Swift kullanmama rağmen. KeyboardWillShow yöntemimde şunları yazdım:

if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {

    let heightValue = keyboardSize.height    

    ...
}

Garip bir şekilde, keyboardWillShow ilk kez çağrıldı, heightValue 216.0 idi, ancak sonraki çağrılarda 0 oldu! Belki de bu bir Xcode hatasıdır.

UIKeyboardFrameBeginUserInfoKey'i bir UIKeyboardFrameEndUserInfoKey ile değiştirdim ve sorunu benim için düzelttim.


1
Ben de aynı şeyi fark ettim. Aynı zamanda sadece klavyenin ilk gösterimi için geçerli görünüyor. Ek görünüm denetleyicilerindeki klavyeler, o görünüm denetleyicisi için ilk gösterildiğinde yüksekliği 0 olarak bildirdi.
jackofallcode

5

Bu sorun iOS 11'de yaşanıyor.

Değiştir

"UIKeyboardFrameEndUserInfoKey" ile "UIKeyboardFrameBeginUserInfoKey"

aşağıda gösterildiği gibi sorunu çözecektir

Amaç-C Kodu:

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

3

Aşağıdaki kodu kullanarak klavye yüksekliğini hesaplayın.

Güvenli alan ve güvenli olmayan alan cihazları ile her iki cihaz için de çalışmaktadır.

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
    }
}

2

Yaklaşımınız, gösterilmeden önce çerçeve yüksekliğini elde etmeye çalışıyor ve bu yüzden 0 olması gerektiği için ilk denemede neden olmadığından emin değilim! İşte klavye yüksekliğinin hızlı 4.2'de nasıl doğru bir şekilde alınacağına dair bir örnek:

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
}

Bu, klavye görünmeden ÖNCE klavye çerçevesi özelliklerini doğru bir şekilde sağlayacaktır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.