새소식

iOS/UIKit

[iOS] 키보드 처리

  • -

1. UIResponder 추가

// 현재 응답받는 UI를 알아내기 위해 사용 (textfield, textview 등)
extension UIResponder {
    
    private struct Static {
        static weak var responder: UIResponder?
    }
    
    static var currentResponder: UIResponder? {
        Static.responder = nil
        UIApplication.shared.sendAction(#selector(UIResponder._trap), to: nil, from: nil, for: nil)
        return Static.responder
    }
    
    @objc private func _trap() {
        Static.responder = self
    }
}

 

2. keyboardWillShowkeyboardWillHide 함수 선언

@objc func keyboardWillShow(_ sender: Notification) {
    // keyboardFrame: 현재 동작하고 있는 이벤트에서 키보드의 frame을 받아옴
    // currentTextField: 현재 응답을 받고있는 UITextField를 알아냅니다.
    guard let keyboardFrame = sender.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue,
          let currentTextField = UIResponder.currentResponder as? UITextField else { return }
    
    // Y축으로 키보드의 상단 위치
    let keyboardTopY = keyboardFrame.cgRectValue.origin.y
    // 현재 선택한 텍스트 필드의 Frame 값
    let convertedTextFieldFrame = view.convert(currentTextField.frame,
                                              from: currentTextField.superview)
    // Y축으로 현재 텍스트 필드의 하단 위치
    let textFieldBottomY = convertedTextFieldFrame.origin.y + convertedTextFieldFrame.size.height
    
    // Y축으로 텍스트필드 하단 위치가 키보드 상단 위치보다 클 때 (즉, 텍스트필드가 키보드에 가려질 때가 되겠죠!)
    if textFieldBottomY > keyboardTopY {
        let textFieldTopY = convertedTextFieldFrame.origin.y
        // 노가다를 통해서 모든 기종에 적절한 크기를 설정함.
        let newFrame = textFieldTopY - keyboardTopY/1.6
        view.frame.origin.y -= newFrame
    }
}

 

 

3. viewWillAppearviewWillDisapper에 NotificationCenter 추가

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(keyboardWillShow),
                                           name: UIResponder.keyboardWillShowNotification,
                                           object: nil)
    NotificationCenter.default.addObserver(self,
                                           selector: #selector(keyboardWillHide),
                                           name: UIResponder.keyboardWillHideNotification,
                                           object: nil)
}
override func viewWillDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification
}

 

출처

 

[Swift/TIL #21] 키보드가 화면을 가릴 때, Y축으로 뷰 이동 방법

[TIL #21] 2023 / 05 / 08 TextField 나 TextView 등 터치 이벤트로 키보드가 올라올 때, 키보드가 텍스트 필드를 가리는 현상이 발생할 때가 있습니다. 이런 이슈를 방지하는 방법을 간단히 알아봅시다. 방

ios-daniel-yang.tistory.com

 

728x90

'iOS > UIKit' 카테고리의 다른 글

[iOS] UIScrollView  (1) 2024.03.09
[iOS] @IBInspectable  (0) 2024.01.06
[iOS] 기종별로(iPhone, iPad) StoryBoard 구분하기  (1) 2023.12.30
[iOS] 한 개의 ViewController에서 여러 개의 tableView 처리 방법  (0) 2023.06.17
[iOS] TableView  (0) 2023.01.24
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.