Files
luma/Luma/KeyboardObserver.swift

39 lines
1.2 KiB
Swift

#if canImport(UIKit)
import SwiftUI
import UIKit
@MainActor
@Observable
final class KeyboardObserver {
private(set) var height: CGFloat = 0
init() {
let center = NotificationCenter.default
center.addObserver(
forName: UIResponder.keyboardWillChangeFrameNotification,
object: nil,
queue: .main
) { [weak self] note in
let endFrame = (note.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect) ?? .zero
Task { @MainActor in self?.apply(endFrame: endFrame) }
}
center.addObserver(
forName: UIResponder.keyboardWillHideNotification,
object: nil,
queue: .main
) { [weak self] _ in
Task { @MainActor in self?.height = 0 }
}
}
private func apply(endFrame: CGRect) {
guard let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
let window = scene.windows.first(where: \.isKeyWindow)
else { return }
let screenHeight = window.bounds.height
let safeAreaBottom = window.safeAreaInsets.bottom
height = max(0, screenHeight - endFrame.origin.y - safeAreaBottom)
}
}
#endif