簡體   English   中英

iOS 11 - 鍵盤高度在鍵盤通知中返回 0

[英]iOS 11 - Keyboard Height is returning 0 in keyboard notification

我一直在使用鍵盤通知沒有任何問題並獲得鍵盤的確切高度。

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

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

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

在這種情況下會出現什么問題? 我正在使用 xcode 9 Beta 5

使用這個:

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

對於 Swift,您可以使用:

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

替換UIKeyboardFrameBeginUserInfoKey

UIKeyboardFrameEndUserInfoKey

以下來自Apple Docs。

UIKeyboardFrameBeginUserInfoKey- 包含 CGRect 的 NSValue 對象的鍵,該對象在屏幕坐標中標識鍵盤的起始幀。

UIKeyboardFrameEndUserInfoKey - 包含 CGRect 的 NSValue 對象的鍵,該對象在屏幕坐標中標識鍵盤的結束幀。

試試這個:

UIKeyboardFrameBeginUserInfoKey替換UIKeyboardFrameEndUserInfoKey

我在使用 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,它為我解決了這個問題。

此問題發生在 iOS 11 上。

替換

“UIKeyboardFrameBeginUserInfoKey”與“UIKeyboardFrameEndUserInfoKey”

如下所示將解決問題

目標 C 代碼:

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

斯威夫特 2.3:

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

斯威夫特3:

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

使用以下代碼計算鍵盤高度。

它適用於具有安全區域和非安全區域設備的設備。

代碼:

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

您的方法試圖在顯示之前獲取框架高度,這就是為什么它應該是 0,我不確定為什么它不是第一次嘗試! 以下是如何在 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
}

這將鍵盤出現之前正確提供鍵盤框架屬性。

盡管當我們從 SafeArea 調整 BottomSpace Constraints 時我們得到了准確的鍵盤高度,但它會產生更多的空白空間。 因此,如果我們要調整底部空間約束,我們必須從鍵盤高度中減去安全區域邊距。

    @objc func keyBoardWillShow(notification: NSNotification) {
                  
    
                  if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
                      var bottomPadding: CGFloat = 0
                      //IF device is latest including iPhone x, it will have bottom padding as safeArea Insets. So we have to subtract that from REAL Keyboard HEIGHT.
                      if let window = UIApplication.shared.windows.first{
                        bottomPadding = window.safeAreaInsets.bottom
                      }
    
                      let keyboardRectangle = keyboardFrame.cgRectValue
                      let keyboardHeight = keyboardRectangle.height - bottomPadding
                      bottomSpaceConstraint.constant = keyboardHeight
                  }
                  self.view.layoutIfNeeded()
              }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM