나는 문제없이 키보드 알림을 사용하고 있으며 키보드의 정확한 높이를 얻었습니다.
- (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)을 사용하여 비슷한 문제가 발생했습니다. 스위프트를 사용하고 있었지만. 내 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
}
그러면 키보드가 나타나기 전에 키보드 프레임 속성이 올바르게 제공 됩니다.
