iOS 11 - Chiều cao bàn phím trả về 0 trong thông báo bàn phím


84

Tôi đã sử dụng thông báo Bàn phím mà không gặp bất kỳ sự cố nào và nhận được chiều cao chính xác của Bàn phím.

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

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

nhưng với iOS 11, kích thước bàn phím bằng 0 khi thông báo được gọi.

Vấn đề xảy ra trong kịch bản này là gì? Tôi đang sử dụng xcode 9 Beta 5

Câu trả lời:


190

Dùng cái này:

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

Đối với Swift, bạn có thể sử dụng:

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

1
Bạn lưu ngày của tôi
Helen Zhukova

1
Cảm ơn, sẽ không bao giờ nghĩ về điều đó
Ammar Hadzic

5
Thay đổi từ UIKeyboardFrameBeginUserInfoKey thành UIKeyboardFrameEndUserInfoKey đã thực hiện một thủ thuật, thx.
user2408952

Cảm ơn, tôi đã đầu tư nửa ngày, nhưng không thể tìm ra. cảm ơn vì đã tiết kiệm nửa ngày còn lại của tôi.
Manish Nahar

@Akshay Chỉ khung bắt đầu và khung cuối của bàn phím ở các giới hạn màn hình tương ứng.
s.zainulabideen

102

Thay thế UIKeyboardFrameBeginUserInfoKey

với

UIKeyboardFrameEndUserInfoKey

Dưới đây là từ Apple Docs.

UIKeyboardFrameBeginUserInfoKey- Khóa cho một đối tượng NSValue có chứa CGRect xác định khung bắt đầu của bàn phím trong tọa độ màn hình.

UIKeyboardFrameEndUserInfoKey - Khóa cho đối tượng NSValue chứa CGRect xác định khung kết thúc của bàn phím trong tọa độ màn hình.


13
Nhu cầu của Apple để cập nhật mã ví dụ của họ sau đó, bởi vì nó không hoạt động nữa trên iOS 11. Cũng từ tài liệu của Apple, nơi họ sử dụng UIKeyboardFrameBeginUserInfoKey: developer.apple.com/library/content/documentation/...
wildcat12

Đã giải quyết vấn đề của tôi! Cảm ơn vì lời khuyên!
Ernie

Ai đó có thể giải thích cho tôi như tôi 5 tuổi sự khác biệt giữa hai thứ này là gì và tại sao điều này lại tạo ra sự khác biệt khi nói đến việc UIScrollView tự động cuộn không? Tôi thực sự đánh giá cao việc đó. Cảm ơn!
Mario

Nó không hoạt động sau khi chạm vào trường văn bản với numPad. nếu sau khi numPad tôi nhấn vào trường văn bản chung, bàn phím không lên nữa và khi nó loại bỏ chế độ xem, hãy xuống
Jack Daniel

7

Thử đi:

Thay thế UIKeyboardFrameBeginUserInfoKeybằngUIKeyboardFrameEndUserInfoKey


1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];phương pháp keyboardWillChangeFrame: không chỉ chạy một lần, có thể gấp đôi, hoặc more.Maybe một số bàn phím có thanh công cụ đặc biệt trên đầu đôi khi, những phương pháp sẽ chạy nhiều lần tại time.So này, bạn nên thay thế UIKeyboardFrameBeginUserInfoKey với UIKeyboardFrameEndUserInfoKey để có được những khung hình cuối cùng của bàn phím.
SolinLiu

5

Tôi đã gặp sự cố tương tự khi sử dụng Xcode Phiên bản 9.0 (9A235); mặc dù tôi đang sử dụng Swift. Trong phương pháp keyboardWillShow của tôi, tôi đã viết như sau:

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

    let heightValue = keyboardSize.height    

    ...
}

Thật kỳ lạ, lần đầu tiên keyboardWillShow được gọi, heightValue là 216.0, nhưng trong các lần gọi tiếp theo, nó đã trở thành 0! Có lẽ đây là một lỗi Xcode.

Tôi đã thay thế UIKeyboardFrameBeginUserInfoKey bằng UIKeyboardFrameEndUserInfoKey và nó đã khắc phục sự cố cho tôi.


1
Tôi đa ghi chu điêu tương đương. Nó cũng có vẻ như chỉ áp dụng cho lần đầu tiên bàn phím hiển thị. Bàn phím trên bộ điều khiển chế độ xem bổ sung đã báo cáo chiều cao là 0 lần đầu tiên nó hiển thị cho bộ điều khiển chế độ xem đó.
mã jackofallcode

5

Sự cố này đang xảy ra trên iOS 11.

Thay thế

"UIKeyboardFrameBeginUserInfoKey" với "UIKeyboardFrameEndUserInfoKey"

như hình dưới đây sẽ khắc phục sự cố

Mã Objective-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

3

Tính toán chiều cao bàn phím bằng cách sử dụng mã dưới đây.

Nó hoạt động cho cả thiết bị có khu vực an toàn và thiết bị khu vực không an toàn.

Mã:

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

1

Cách tiếp cận của bạn đang cố gắng lấy chiều cao khung hình trước khi nó được hiển thị, và đó là lý do tại sao nó phải bằng 0 mà tôi không chắc tại sao nó không có ở lần thử đầu tiên! Dưới đây là một ví dụ về cách lấy đúng chiều cao bàn phím trong nhanh chóng 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
}

Điều này sẽ cung cấp chính xác các thuộc tính khung bàn phím TRƯỚC KHI bàn phím xuất hiện.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.