For less complicated keyboard event handling.
- Less complicated keyboard event handling.
- Do not use
NSNotification
, butevent
.
Without KeyboardObserver.swift
let keyboardNotifications = [
UIKeyboardWillShowNotification,
UIKeyboardWillHideNotification,
UIKeyboardWillChangeFrameNotification
]
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
keyboardNotifications.forEach {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardEventNotified:", name: $0, object: nil)
}
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
keyboardNotifications.forEach {
NSNotificationCenter.defaultCenter().removeObserver(self, name: $0, object: nil)
}
}
func keyboardEventNotified(notification: NSNotification) {
guard let userInfo = notification.userInfo else { return }
let keyboardFrameEnd = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
let curve = UIViewAnimationCurve(rawValue: (userInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).integerValue)!
let options = UIViewAnimationOptions(rawValue: UInt(curve.rawValue << 16))
let duration = NSTimeInterval(userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber)
let distance = UIScreen.mainScreen().bounds.height - keyboardFrameEnd.origin.y
let bottom = distance >= bottomLayoutGuide.length ? distance : bottomLayoutGuide.length
UIView.animateWithDuration(duration, delay: 0.0, options: [options], animations:
{ [weak self] () -> 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 s = self else { return }
switch event.type {
case .WillShow, .WillHide, .WillChangeFrame:
let distance = UIScreen.mainScreen().bounds.height - event.keyboardFrameEnd.origin.y
let bottom = distance >= s.bottomLayoutGuide.length ? distance : s.bottomLayoutGuide.length
UIView.animateWithDuration(event.duration, delay: 0.0, options: [event.options], animations:
{ [weak self] () -> 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 NSNotification
'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.
- iOS8.0 or later
- Xcode 7.3 - Swift2.2
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.
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", '~>0.4.0'
To install KeyboardObserver without a dependency manager, please add KeyboardObserver.swift
to your Xcode Project.
Please file issues or submit pull requests for anything you’d like to see! We're waiting! :)
KeyboardObserver.swift is released under the MIT license. Go read the LICENSE file for more information.