[ios] 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를 사용하고 있습니다.



답변

이것을 사용하십시오 :

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 개체의 키입니다.


답변

이 시도:

교체 UIKeyboardFrameBeginUserInfoKeyUIKeyboardFrameEndUserInfoKey


답변

Xcode 버전 9.0 (9A235)을 사용하여 비슷한 문제가 발생했습니다. 스위프트를 사용하고 있었지만. 내 keyboardWillShow 메서드에서 다음을 작성했습니다.

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

    let heightValue = keyboardSize.height

    ...
}

이상하게도 keyboardWillShow가 처음 호출되었을 때 heightValue는 216.0 이었지만 후속 호출 중에 0이되었습니다! 아마도 이것은 Xcode 버그 일 것입니다.

UIKeyboardFrameBeginUserInfoKey를 UIKeyboardFrameEndUserInfoKey로 바꾸고 문제를 해결했습니다.


답변

이 문제는 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


답변

아래 코드를 사용하여 키보드 높이를 계산하십시오.

안전 영역이있는 장치와 비 안전 영역 장치 모두에서 작동합니다.

암호:

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

그러면 키보드가 나타나기 전에 키보드 프레임 속성이 올바르게 제공 됩니다.