iOS 11-키보드 높이가 키보드 알림에서 0을 반환합니다.


84

나는 문제없이 키보드 알림을 사용하고 있으며 키보드의 정확한 높이를 얻었습니다.

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

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

하지만 iOS 11에서는 알림이 호출 될 때 키보드 크기가 0입니다.

이 시나리오에서 발생하는 문제는 무엇입니까? xcode 9 Beta 5를 사용하고 있습니다.

답변:


190

이것을 사용하십시오 :

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

Swift의 경우 다음을 사용할 수 있습니다.

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

1
당신은 내 일 저장
헬렌 주 코바

1
덕분에, 그 생각도 못했네
아마르 Hadzic을

5
UIKeyboardFrameBeginUserInfoKey에서 UIKeyboardFrameEndUserInfoKey로 변경하면 트릭이 생겼습니다.
user2408952 08

감사합니다. 반나절을 투자했지만 알아낼 수 없었습니다. 다른 반나절을 구 해주셔서 감사합니다.
마니 하르

@Akshay 각 화면 경계에서 키보드의 시작 프레임과 끝 프레임입니다.
s.zainulabideen

102

바꾸다 UIKeyboardFrameBeginUserInfoKey

UIKeyboardFrameEndUserInfoKey

아래는 Apple Docs에서 가져온 것입니다.

UIKeyboardFrameBeginUserInfoKey- 화면 좌표에서 키보드의 시작 프레임을 식별하는 CGRect를 포함하는 NSValue 개체의 키입니다.

UIKeyboardFrameEndUserInfoKey-화면 좌표에서 키보드의 끝 프레임을 식별하는 CGRect를 포함하는 NSValue 개체의 키입니다.


13
Apple은 iOS 11에서 더 이상 작동하지 않기 때문에 예제 코드를 업데이트해야합니다. 또한 UIKeyboardFrameBeginUserInfoKey를 사용하는 Apple 문서에서 : developer.apple.com/library/content/documentation/…
wildcat12

내 문제를 해결했습니다! 조언 해주셔서 감사합니다!
Ernie

누군가가 내가 5 살인 것처럼 나에게이 둘의 차이점이 무엇인지, 그리고 UIScrollView가 자동으로 스크롤되도록 할 때 차이가 나는 이유를 설명 할 수 있습니까? 정말 감사하겠습니다. 감사!
Mario

숫자 패드로 텍스트 필드를 탭한 후 작동하지 않습니다. 만약 더 이상하지 최대 일반 텍스트 필드에 숫자 패드 나 탭, 키보드 후 그것은보기를 해제 할 때 내려
잭 다니엘

7

이 시도:

교체 UIKeyboardFrameBeginUserInfoKeyUIKeyboardFrameEndUserInfoKey


1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];keyboardWillChangeFrame 메서드는 한 번만 실행되는 것이 아니라 두 번 이상 실행되는 경우가 있습니다. 일부 키보드에는 때때로 특수 도구 모음이있을 수 있으며,이 때 메서드가 여러 번 실행 됩니다. 따라서 UIKeyboardFrameBeginUserInfoKeyUIKeyboardFrameEndUserInfoKey 로 대체 하여 키보드.
SolinLiu

5

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로 바꾸고 문제를 해결했습니다.


1
나는 똑같은 것을 알아 차렸다. 또한 키보드가 처음 표시 될 때만 적용되는 것 같습니다. 추가 뷰 컨트롤러의 키보드는 해당 뷰 컨트롤러에 대해 처음 표시했을 때 높이를 0으로보고했습니다.
jackofallcode

5

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

3

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

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

암호:

@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

귀하의 접근 방식은 표시되기 전에 프레임 높이를 얻으려고 시도하고 있으므로 첫 번째 시도에서 왜 그렇지 않은지 확실하지 않은 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
}

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.