❓ 상황
프로젝트 진행 중, 텍스트 필드에 입력할 때 키보드가 올라오면서 하단의 가입 버튼이 키보드에 가려지는 문제가 발생했습니다. 가입 버튼을 키보드 위로 자연스럽게 올리고 싶다는 단순한 목표였지만, iOS의 동작 타이밍과 키보드 노티피케이션의 구조를 이해해야 제대로 해결할 수 있는 문제였습니다. 또한, Minimum Target이 iOS 14였기 때문에 @objc, addObserver 같은 Objective-C 기반 코드는 최대한 줄이고 Swift스럽게 구현하고자 고민이 많았습니다.
🤔 처음 고민했던 방법들
textFieldDidBeginEditing,textFieldDidEndEditing델리게이트 메서드를 활용해서 버튼 위치 조정?- NotificationCenter의
UIKeyboardWillShowNotification사용해서 키보드 높이를 가져오기? - 하드코딩된 키보드 높이로 미리 계산해두기?
처음에는 델리게이트 메서드 안에서 키보드 높이를 바로 가져올 수 있을 거라 생각했지만, 결과는 예상과 달랐습니다.
🧨 왜 textFieldDidBeginEditing에서는 키보드 높이를 알 수 없을까?
textFieldDidBeginEditing은 단지 텍스트 필드가 포커스를 받았다는 사실만 알려주는 메서드입니다.
하지만 이 시점에는 키보드가 아직 화면에 완전히 나타나지 않았고,
즉 keyboardWillShowNotification도 아직 호출되지 않았을 수 있습니다.
키보드의 정확한 높이를 얻기 위해서는, 반드시 UIKeyboardWillShowNotification의 userInfo에서 keyboardFrameEndUserInfoKey 값을 사용해야 합니다.
✅ 해결 방법: Notification + Combine
결국 가장 안전하고 정확한 방법은 NotificationCenter의 키보드 노티피케이션을 활용하는 것입니다.
저는 Combine을 사용해서 다음과 같이 구현했습니다:

이렇게 keyboardHeight가 실시간으로 갱신되면, 버튼을 키보드 위에 맞춰 자연스럽게 올릴 수 있습니다.
💡 왜 Combine을 사용했을까?
- 기존
NotificationCenter.addObserver방식은 옵저버 등록/해제가 번거롭고 실수 가능성이 높습니다. - Combine에서는
cancellables를 통해 생명주기를 관리하므로 메모리 누수를 방지할 수 있습니다. - Swift다운 방식으로 선언적이고 가독성이 좋습니다.
🧾 정리
| 방법 | 키보드 높이 알 수 있나? | 장점 | 단점 |
|---|---|---|---|
textFieldDidBeginEditing |
❌ | 텍스트 필드 활성화 시점 감지 | 키보드 정보 없음 |
NotificationCenter + addObserver |
✅ | 정확한 키보드 정보 제공 | 수동 해제 필요 |
NotificationCenter.publisher (Combine) |
✅ | 자동 해제, 선언적, Swift스럽게 | iOS 13+ 필요 |
'iOS > UIkit' 카테고리의 다른 글
| UICollectionViewCompositionalLayout (0) | 2024.08.07 |
|---|