

**NotificationCenter**에 키보드가 켜지고 꺼지는 이벤트에 대한 옵저버를 등록해주면 된다.
옵저버 등록
UIResponder에 정의된 키보드 이벤트를 **addObserver()**의 name 파라미터로 넣어준다.
UIResponder**.**keyboardWillShowNotification : 키보드가 나타나는 이벤트UIResponder**.**keyboardWillHideNotification : 키보드가 사라지는 이벤트selector 파라미터에 들어간 함수는 해당 이벤트가 발생하면 호출된다.override func viewDidLoad() {
...(중략)...
**// 키보드 노티피케이션 옵저버 등록
NotificationCenter.default.addObserver(
self,
selector: #selector(keyboardWillShow),
name: UIResponder.keyboardWillShowNotification,
object: nil
)
NotificationCenter.default.addObserver(
self,
selector: #selector(keyboardWillHide),
name: UIResponder.keyboardWillHideNotification,
object: nil
)**
}
인스턴스가 메모리에서 해제되기 전에 호출되는 deinit 메서드를 통해 인스턴스 해제 시 옵저버도 해제해주면서 불필요한 참조를 제거해준다.
**// 클래스의 인스턴스가 메모리에서 해제되기 전에 호출되는 메서드
deinit {
// 옵저버 해제
NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}**
옵저버 등록 시 넣어준 @objc 메서드를 작성해준다.
**// 키보드가 나타날 때 호출되는 메서드
@objc func keyboardWillShow(notification: Notification) {
guard let userInfo = notification.userInfo else { return }
guard let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else {
return
}
// 애니메이션을 사용하여 레이아웃 업데이트 → 친구 추가하기 버튼을 위로 올려준다.
UIView.animate(withDuration: 0.3) {
self.friendAddView.friendAddButton.transform = CGAffineTransform(
translationX: 0,
y: -keyboardFrame.height+24
)
}
}
// 키보드가 사라질 때 호출되는 메서드
@objc func keyboardWillHide(notification: Notification) {
self.friendAddView.friendAddButton.transform = .identity
}**
Notification**타입의 값을 받아준다. Notification의 userInfo 딕셔너리에는 UIResponder.keyboardFrameEndUserInfoKey 키값으로 반환되는 키보드의 사이즈 값이 들어 있있다.CGAffineTransform**을 이용해주었다.
CGAffineTransform을 사용하면 움직인 만큼의 정보를 가지고 있다가 **.identity**를 통해 원해 상태로 돌아갈 수 있다.
위 코드에서는 친구 추가하기 버튼이 키보드 없을 때와 있을 때의 bottom 패딩 값이 달라져서 키보드 높이 값에서 24만큼의 보정값을 반영해주었다.
CGAffineTransform(
translationX: 0,
**y: -keyboardFrame.height+24**
)
