KeyboardObserver
  • March 11, 2024

For less complicated keyboard event handling.

Carthage compatible

Features


  • Less complicated keyboard event handling.
  • Do not use Notification , but event .

Difference


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
}
}
}

How to use


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.

Runtime Requirements


  • iOS 8.0 or later
  • Xcode 10.0
  • Swift4.2

Installation and Setup


Information: To use KeyboardObserver with a project targeting lower than iOS 8.0, you must include the KeyboardObserver.swift source file directly in your project.

Installing with Carthage

Just add to your Cartfile:

github “morizotter/KeyboardObserver”

Installing with CocoaPods

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’

Manual Installation

To install KeyboardObserver without a dependency manager, please add KeyboardObserver.swift to your Xcode Project.

GitHub


View Github

#hide #keyboard
YOU MIGHT ALSO LIKE...
SwiftSpeech

Recognize your user's voice elegantly without having to figure out authorization and audio engines. SwiftSpeech Examples Features Installation Getting Started ...

SwiftUIValueSlider

Example To run the example project, clone the repo, and run pod install from the Example directory first. Requirements iOS 14.0 Installation ...

Sliders

Sliders is a compilation of all my stylable drag based SwiftUI components. It provides a variety of unique controls as well ...

SlidingRuler

SlidingRuler is a Swift package containing a SwiftUI control that acts like an linear infinite slider or a finite, more precise ...

Skeletonui

SkeletonUI aims to bring an elegant, declarative syntax to skeleton loading animations. Get rid of loading screens or spinners and ...