생계유지형 개발자/Mobile

[ios] keyboard 높이만큼 webview 사이즈 올리기

이 가을 2022. 3. 4. 15:54

아이폰은 입력할 때 키보드 영역이 화면 위에 뜨는 형태여서 화면의 아래 부분을 가리게 된다.

만약 웹뷰 화면에 하단 툴바가 있다면, 툴바 역시 가려지게 된다.

 

키보드 영역만큼 화면을 올려주기 위해서 NotificationCenter로 키보드가 나오고 사라지는 이벤트를 이용한다.

 

NotificationCenter Observer 생성 / 제거

/* ---------------------------------------------------
 * Keyboard 노출 감지하는 NotificationCenter Observer 추가
 * ---------------------------------------------------- */
func addKeyboardNotifications(){
    // 키보드가 나타날 때 앱에 알리고 keyboardWillShow() 메소드를 실행하는 Observer를 추가한다.
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification , object: nil)
    // 키보드가 사라질 때 앱에 알리고 keyboardWillHide() 메소드를 실행하는 Observer를 추가한다.
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil)
    
}

/* ---------------------------------------------------
 * Keyboard 노출 감지하는 NotificationCenter Observer 제거
 * ---------------------------------------------------- */
func removeKeyboardNotifications(){
    // 키보드가 나타날 때 앱에게 알리는 Observer를 제거한다.
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification , object: nil)
    // 키보드가 사라질 때 앱에게 알리는 Observer를 제거한다.
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}

 

Keyboard willShow / willHide 알림 수신

// 키보드가 나타나는 UIResponder.keyboardWillShowNotification 알림 수신
@objc func keyboardWillShow(_ noti: NSNotification){
    // 키보드의 높이만큼 웹뷰 영역을 올려준다.
    if let keyboardFrame: NSValue = noti.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        let keyboardHeight  = keyboardRectangle.height
        self.webViewMain.frame.origin.y -= (keyboardHeight - 50)    // 툴바높이 50 제외
    }
}
// 키보드가 사라지는 UIResponder.keyboardWillHideNotification 알림 수신
@objc func keyboardWillHide(_ noti: NSNotification){
    // 키보드의 높이만큼 웹뷰 영역을 내려준다.
    if let keyboardFrame: NSValue = noti.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        let keyboardHeight  = keyboardRectangle.height
        self.webViewMain.frame.origin.y += (keyboardHeight - 50)    // 툴바높이 50 제외
    }
}

 

View 에 Observer 등록

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.addKeyboardNotifications()
}

override func viewWillDisappear(_ animated: Bool){
    super.viewWillDisappear(animated)
    self.removeKeyboardNotifications()
}