본문 바로가기
iOS/UIkit

키보드와 함께 버튼을 자연스럽게 올리는 방법 (feat. Combine)

by hong7 2025. 4. 17.

❓ 상황

프로젝트 진행 중, 텍스트 필드에 입력할 때 키보드가 올라오면서 하단의 가입 버튼이 키보드에 가려지는 문제가 발생했습니다. 가입 버튼을 키보드 위로 자연스럽게 올리고 싶다는 단순한 목표였지만, 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