[iOS] 키보드 처리
2023. 12. 30. 13:29
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. keyboardWillShow와 keyboardWillHide 함수 선언
@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. viewWillAppear와 viewWillDisapper에 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
}
출처
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 |