관찰자 onKeyboardDisplayed가 textViewDidBeginEditing 전에 호출되는 이유
내 앱이 신속합니다. UITextField를 편집 할 때 때때로 키보드가 필드를 숨 깁니다. 그래서 위임 textFieldDidBeginEditing을 사용하여 "activeTextField"를 설정하고 textFieldDidEndEditing을 사용하여 nil로 재설정합니다. 그런 다음 viewDidLoad에서 "activeTextField"값을 테스트하는 onKeyboardDisplayed 함수에 연결된 관찰자를 추가하여 필요한 경우 화면을 위로 스 와이프 할 수 있습니다. 그리고 그것은 잘 작동합니다 :)
나쁜 새로운 점은 위임 textViewDidBeginEditing을 사용하여 "activeTextView"를 설정하여 UITextView에 대해 동일한 작업을 시도했다는 것입니다. 그러나 UITextField와 달리 델리게이트는 onKeyboardDisplayed 후에 호출되므로 키보드가 여전히 내 UITextView를 숨 깁니다.
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
@objc func onKeyboardDisplayed(notification: Notification) {
guard let keyboardRect = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
return
}
var visibleRect : CGRect = self.view.frame
visibleRect.size.height -= keyboardRect.height
if (activeTextField != nil) {
// Get y position of active textField bottom.
let textFieldBottomPosition = activeTextField!.convert(CGPoint.zero, to: nil).y + activeTextField!.frame.height
if(textFieldBottomPosition > visibleRect.size.height) {
// swipe up
view.frame.origin.y = (visibleRect.size.height - textFieldBottomPosition - 6)
}
}
if (activeTextView != nil) {
// Get y position of active textView bottom.
let textViewBottomPosition = activeTextView!.convert(CGPoint.zero, to: nil).y + activeTextView!.frame.height
if(textViewBottomPosition > visibleRect.size.height) {
// swipe up
view.frame.origin.y = (visibleRect.size.height - textViewBottomPosition - 6)
}
}
}
그것을 고치는 방법을 알고 있습니까?
답변
마지막으로 해결책을 찾았습니다. UITextView 대리자 이벤트 이전에 호출 된 키보드 이벤트
keyboardWillShowNotification을 변경했습니다.
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
의해 keyboardDidShowNotification
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisplayed(notification:)), name: UIResponder.keyboardDidShowNotification, object: nil)
이제 잘 작동합니다. 내 onKeyboardDisplayed 함수는 델리게이트 textViewDidBeginEditing 후에 호출됩니다.
나타나는 키보드를 처리하는 표준 방법은 다음과 같습니다.
ViewController에서 :
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardWillShow), name: UIControl.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardWillHide), name: UIControl.keyboardWillHideNotification, object: nil)
}
@objc private func handleKeyboardWillShow(notification: NSNotification){
guard let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else{
return
}
self.view.frame.origin.y -= keyboardSize.height
}
@objc private func handleKeyboardWillHide(notification: NSNotification){
self.view.frame.origin.y = 0
}
키보드 높이에 따라 뷰 프레임을 위아래로 이동합니다. 질문을 올바르게 이해하면 도움이 될 것입니다.