2017-08-15 119 views
72

我一直在使用鍵盤通知沒有任何問題,並獲得鍵盤的確切高度。iOS 11 - 鍵盤高度在鍵盤通知中返回0

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

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

但在iOS 11中,調用通知時鍵盤的大小爲0。

在這種情況下發生了什麼問題?我使用的Xcode 9 Beta版5

回答

147

使用此:

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

對於斯威夫特,你可以使用:

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

你救了我的一天 –

+1

感謝,決不會想到 –

+3

改變從UIKeyboardFrameBeginUserInfoKey到UIKeyboardFrameEndUserInfoKey的伎倆,THX的。 – user2408952

87

更換UIKeyboardFrameBeginUserInfoKey

UIKeyboardFrameEndUserInfoKey

以下是Apple Docs。

UIKeyboardFrameBeginUserInfoKey-用於容納的CGRect標識在屏幕座標鍵盤 的起始幀的NSValue對象 的鍵。

UIKeyboardFrameEndUserInfoKey - 包含CGRect的NSValue對象 的密鑰,該CGRect標識屏幕座標中的鍵盤末端幀。

+10

然後Apple需要更新他們的示例代碼,因爲它在iOS 11上不再工作。另外從Apple文檔中,他們使用UIKeyboardFrameBeginUserInfoKey:https://developer.apple.com/library/content/documentation/StringsTextFonts/Conceptual /TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html – wildcat12

+0

解決了我的問題!感謝您的建議! – Ernie

+0

有人能像我這樣向我解釋5歲時這兩者之間的區別是什麼,爲什麼這會使UIScrollView自動滾動時發生變化?我真的很感激。謝謝! – Mario

7

試試這個:

更換UIKeyboardFrameBeginUserInfoKeyUIKeyboardFrameEndUserInfoKey

+1

'[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame :) name:UIKeyboardWillChangeFrameNotification object:nil];'method keyboardWillChangeFrame:不僅可以運行一次,也可以兩次或更多。有時鍵盤上有時會有特殊的工具欄,此時該方法會運行很多次。因此,您應該將** UIKeyboardFrameBeginUserInfoKey **替換爲** UIKeyboardFrameEndUserInfoKey **得到鍵盤的最後一幀。 – SolinLiu

5

我使用的Xcode 9.0版(9A235)也有類似的問題;雖然我在使用Swift。在我keyboardWillShow方法我寫了下面:

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

    let heightValue = keyboardSize.height  

    ... 
} 

奇怪的是,在第一時間keyboardWillShow叫,heightValue爲216.0,但在隨後的通話,它已成爲0!也許這是一個Xcode錯誤。

我用UIKeyboardFrameEndUserInfoKey替換了UIKeyboardFrameBeginUserInfoKey,它解決了我的問題。

+1

我注意到了同樣的事情。它似乎也只適用於第一次鍵盤顯示。第一次顯示該視圖控制器時,其他視圖控制器上的鍵盤報告高度爲0。 – jackofallcode

1

這個問題是發生在iOS上11

如下圖所示,將解決這個問題 「UIKeyboardFrameEndUserInfoKey」

更換

「UIKeyboardFrameBeginUserInfoKey」

的Objective-C代碼:

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

Swift 2。3:

let keyboardSize = (NfnPsgVar.userInfo![UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue().size 

斯威夫特3:

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