나는 키보드에 가려진 뷰를 보여주게 할 때는 항상 view의 origin.y 값을 수정하여 보여주게 했다.
근데 만약 view 자체를 통째로 옮기는 것이 아니라 다른 방법을 쓰고 싶어 기록 겸 글을 쓰게 됐다.
1. 옵저버 생성
먼저 키보드가 show, hide 되는 이벤트를 알려줄 옵저버를 생성한다.
이 과정은 view를 움직이든, 버튼을 움직이든 공통되는 과정이다.
func moveKeyboardAndView() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
}
1-1. 옵저버 해제
옵저버를 생성해 줬다면 해제해 주는 것이 메모리 관리 측면에서 좋기 때문에 해제를 해준다.
func liftMoveKeyboardAndView() {
NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
2. Selector 함수 생성
keyboardWillShow, keyboardWillHide Selector 함수를 생성한다.
@objc func keyboardWillShow(notification: NSNotification) {
// 키보드 올림
let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
if let keyboardSize = keyboardSize {
UIView.animate(withDuration: 0.3) {
self.myButtonView.transform = CGAffineTransform(translationX: 0, y: -keyboardSize.height)
}
}
}
@objc func keyboardWillHide() {
self.myButtonView.transform = .identity
}
뷰를 움직이는 방법은 흔히 아는 방법인 조건문을 사용해서 view의 origin의 y값이 0과 같을 때 움직이는 방법이 있고,
나는 CGAffineTransform(translationX:y:)를 사용해서 만들었다.
이렇게 사용하면 움직인 만큼의 값을 기억하고 있다가 키보드를 내릴 때 .identity를 해주면 원래대로 돌아와서 편하고 간단하다.
우선 키보드 사이즈의 값을 구하려면 NSNotification형의 매개인자를 추가해야 한다.
이러면 userInfo의 값들 중에서 딕셔너리에 UIResponder.keyboardFrameEndUserInfoKey를 키값으로 가지고 있는 값을 구해서
NSValue로 타입캐스팅 후 cgRectValue값을 가져온다.
그러면 키보드의 width, height값을 구할 수 있다.
etc. 흔히 사용하는? 방식
@objc func keyboardWillShow(notification: NSNotification) {
// 키보드 올림
let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue // 키보드 사이즈를 NSValue로 타입캐스팅
if let keyboardSize = keyboardSize {
UIView.animate(withDuration: 0.3) {
if view.frame.origin.y == 0 {
self.view.frame.origin.y -= keyboardSize
}
}
}
}
@objc func keyboardWillHide() {
// 키보드 내림
if self.view.frame.origin.y != 0 {
self.view.frame.origin.y = 0
}
}
오타나 잘못된 정보 있으면 알려주시면 감사하겠습니다.
'Swift' 카테고리의 다른 글
Swift Coding Convention에 대한 정리 (0) | 2022.04.30 |
---|---|
FirebaseAuth 기능 구현 (0) | 2022.04.03 |
IOS) 간단한 토이프로젝트를 만들어 보다 (0) | 2021.08.09 |
[Swift} Optional 기본 개념 (0) | 2021.07.13 |
테이블 뷰 구현 이론 (0) | 2021.07.13 |