- August 28, 2025
- Mins Read
For less complicated keyboard event handling.
Notification
, but event
.Without KeyboardObserver.swift
let keyboardNotifications: [Notification.Name] = [
.UIKeyboardWillShow,
.UIKeyboardWillHide,
.UIKeyboardWillChangeFrame,
]
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
keyboardNotifications.forEach {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardEventNotified:), name: $0, object: nil)
}
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
keyboardNotifications.forEach {
NotificationCenter.default.removeObserver(self, name: $0, object: nil)
}
}
@objc func keyboardEventNotified(notification: NSNotification) {
guard let userInfo = notification.userInfo else { return }
let keyboardFrameEnd = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
let curve = UIView.AnimationCurve(rawValue: (userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as! NSNumber).intValue)!
let options = UIView.AnimationOptions(rawValue: UInt(curve.rawValue << 16))
let duration = TimeInterval(truncating: userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber)
let bottom = keyboardFrameEnd.height – bottomLayoutGuide.length
UIView.animate(withDuration: duration, delay: 0.0, options: [options], animations:
{ () -> Void in
self.textView.contentInset.bottom = bottom
self.textView.scrollIndicatorInsets.bottom = bottom
} , completion: nil)
}
With KeyboardObserver
let keyboard = KeyboardObserver()
override func viewDidLoad() {
super.viewDidLoad()
keyboard.observe { [weak self] (event) -> Void in
guard let self = self else { return }
switch event.type {
case .willShow, .willHide, .willChangeFrame:
let keyboardFrameEnd = event.keyboardFrameEnd
let bottom = keyboardFrameEnd.height – self.bottomLayoutGuide.length
UIView.animate(withDuration: event.duration, delay: 0.0, options: [event.options], animations: { () -> Void in
self.textView.contentInset.bottom = bottom
self.textView.scrollIndicatorInsets.bottom = bottom
}, completion: nil)
default:
break
}
}
}
Create KeyboardObserver
instance where you want, and the instance observes keyboard untill deinit.
Call observe(event: KeyboardEvent)
to observe keyboard events. event
is converted keyboard notification object.
public struct KeyboardEvent {
public let type: KeyboardEventType
public let keyboardFrameBegin: CGRect
public let keyboardFrameEnd: CGRect
public let curve: UIViewAnimationCurve
public let duration: NSTimeInterval
public var isLocal: Bool?
public var options: UIViewAnimationOptions {
return UIViewAnimationOptions(rawValue: UInt(curve.rawValue << 16))
}
…
event
has properties above. You don’t have to convert Notification
‘s userInfo to extract keyboard event values.
KeyboardEentType
has types same as keyboard’s notification name. Like this below:
public enum KeyboardEventType {
case willShow
case didShow
case willHide
case didHide
case willChangeFrame
case didChangeFrame
…
}
It has also public var notificationName: String
which you can get original notification name.
github “morizotter/KeyboardObserver”
CocoaPods is a centralised dependency manager that automates the process of adding libraries to your Cocoa application. You can install it with the following command:
$ gem update
$ gem install cocoapods
$ pods –version
To integrate KeyboardObserver into your Xcode project using CocoaPods, specify it in your Podfile
and run pod install
.
platform :ios, ‘8.0’
use_frameworks!
pod “KeyboardObserver”, ‘~> 2.1’
To install KeyboardObserver without a dependency manager, please add KeyboardObserver.swift
to your Xcode Project.
This package provides you with an easy way to show tooltips over any SwiftUI view, since Apple does not provide ...
SimpleToast is a simple, lightweight, flexible and easy to use library to show toasts / popup notifications inside iOS or ...
Create Toast Views with Minimal Effort in SwiftUI Using SSToastMessage. SSToastMessage enables you to effortlessly add toast notifications, alerts, and ...