Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/morizotter/KeyboardObserver
For less complicated keyboard event handling.
https://github.com/morizotter/KeyboardObserver
Last synced: 7 days ago
JSON representation
For less complicated keyboard event handling.
- Host: GitHub
- URL: https://github.com/morizotter/KeyboardObserver
- Owner: morizotter
- License: mit
- Archived: true
- Created: 2015-12-13T19:57:33.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2022-05-11T01:17:26.000Z (over 2 years ago)
- Last Synced: 2024-04-29T23:20:46.240Z (8 months ago)
- Language: Swift
- Homepage:
- Size: 67.4 KB
- Stars: 161
- Watchers: 6
- Forks: 17
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-ios - KeyboardObserver - For less complicated keyboard event handling. (UI / Keyboard)
- awesome-ios-star - KeyboardObserver - For less complicated keyboard event handling. (UI / Keyboard)
README
# KeyboardObserver
For less complicated keyboard event handling.[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
## Features
- Less complicated keyboard event handling.
- Do not use `Notification` , but `event` .## Difference
**Without KeyboardObserver.swift**
```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**
```Swift
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.
```swift
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:
```Swift
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:
```ogdl
github "morizotter/KeyboardObserver"
```### Installing with CocoaPods
[CocoaPods](http://cocoapods.org) is a centralised dependency manager that automates the process of adding libraries to your Cocoa application. You can install it with the following command:
```bash
$ 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`.
```bash
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.
## Contribution
Please file issues or submit pull requests for anything you’d like to see! We're waiting! :)
## License
KeyboardObserver.swift is released under the MIT license. Go read the LICENSE file for more information.