관찰자 onKeyboardDisplayed가 textViewDidBeginEditing 전에 호출되는 이유

Dec 23 2020

내 앱이 신속합니다. 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)
        }
    }
}

그것을 고치는 방법을 알고 있습니까?

답변

2 syntiz Dec 23 2020 at 20:36

마지막으로 해결책을 찾았습니다. 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 후에 호출됩니다.

1 LucaSfragara Dec 23 2020 at 18:54

나타나는 키보드를 처리하는 표준 방법은 다음과 같습니다.

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
}

키보드 높이에 따라 뷰 프레임을 위아래로 이동합니다. 질문을 올바르게 이해하면 도움이 될 것입니다.