【Swift】キーボードの表示/非表示を検知する方法!UIResponder
この記事からわかること
- Swiftでキーボードが表示/非表示になったことを検知する方法
- UIResponderのkeyboardWillShowNotification/keyboardWillHideNotificationの使い方
- キーボードのサイズ(横幅や高さ)を取得する方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:16.0
- iOS:18.0
- Swift:5.9
- macOS:Sonoma 14.6.1
キーボードの表示/非表示を検知する方法
公式リファレンス:UIResponder.keyboardWillShowNotification
Swiftでキーボードが表示されたかどうかを検知するにはNotificationCenter
クラスを使用してUIResponder
のkeyboardWillShowNotification
/keyboardWillHideNotification
を観測対象にします。
keyboardWillShowNotification
ではキーボードが表示されたことをkeyboardWillHideNotification
ではキーボードが非表示になったことを検知することができます。
NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)
.sink { [weak self] _ in
print("キーボードが表示されたよ")
}
.store(in: &cancellables)
NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)
.sink { [weak self] _ in
print("キーボードが非表示になったよ")
}
.store(in: &cancellables)
Swift UIで使用できる管理クラスを実装してみました。
import SwiftUI
import Combine
final class KeyboardResponder: ObservableObject {
@Published var isKeyboardVisible: Bool = false
private var cancellables = Set<AnyCancellable>()
init() {
NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)
.sink { [weak self] _ in
self?.isKeyboardVisible = true
}
.store(in: &cancellables)
NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)
.sink { [weak self] _ in
self?.isKeyboardVisible = false
}
.store(in: &cancellables)
}
}
表示されたキーボードの高さを取得する
表示されたキーボードのサイズ(横幅や高さ)や座標などを取得したい場合は発行されたNSNotification
のuserInfo
プロパティにある辞書型の中からUIResponder.keyboardFrameEndUserInfoKey
キーで取得することが可能です。
NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)
.sink { [weak self] notification in
print("キーボードが表示されたよ")
guard let userInfo = notification.userInfo,
let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
return
}
print("keyboardFrame", keyboardFrame) // keyboardFrame NSRect: {{0, 610}, {440, 346}}
print("keyboardFrame.cgRectValue", keyboardFrame.cgRectValue) // keyboardFrame.cgRectValue (0.0, 610.0, 440.0, 346.0)
print("キーボード横幅", keyboardFrame.cgRectValue.width) // キーボード横幅 440.0
print("キーボード高さ", keyboardFrame.cgRectValue.height) // キーボード高さ 346.0
}
.store(in: &cancellables)
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。