Skip to content

Instantly share code, notes, and snippets.

@brunoguerios
Last active February 16, 2017 17:30
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brunoguerios/888d1c0b13d3b23e5ac825dcb269d72c to your computer and use it in GitHub Desktop.
Save brunoguerios/888d1c0b13d3b23e5ac825dcb269d72c to your computer and use it in GitHub Desktop.
KeyboardController handles the most common case of UI update required when the keyboard is presented on iOS, which is updating the bottom constraint to match the top of the keyboard frame. Simply create an instance of the KeyboardController in your view controller by providing the view controller itself and it's view bottom constraint as input.
//
// KeyboardController.swift
//
// Created by Bruno Guerios on 2017-02-13.
//
import Foundation
import UIKit
class KeyboardController: NSObject {
var viewController: UIViewController
var constraint: NSLayoutConstraint
var isKeyboardHidden: Bool {
return constraint.constant == 0
}
// MARK: Life Cycle
init(viewController: UIViewController, constraint: NSLayoutConstraint) {
self.viewController = viewController
self.constraint = constraint
super.init()
self.setupKeyboardObservers()
}
// MARK: Setup
private func setupKeyboardObservers() {
self.setupKeyboardWillChangeObserver()
self.setupDismissKeyboardTapGestureRecognizer()
}
private func setupKeyboardWillChangeObserver() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(_:)), name: .UIKeyboardWillChangeFrame, object: nil)
}
private func setupDismissKeyboardTapGestureRecognizer() {
let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
tap.delegate = self
viewController.view.addGestureRecognizer(tap)
}
// MARK: Private
func keyboardWillChange(_ notification: Notification) {
guard let info = notification.userInfo else { return }
let keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
constraint.constant = UIScreen.main.bounds.size.height - keyboardFrame.origin.y
let duration = info[UIKeyboardAnimationDurationUserInfoKey] as! TimeInterval
UIView.animate(withDuration: duration, animations: {
self.viewController.view.layoutIfNeeded()
})
}
func dismissKeyboard() {
viewController.view.endEditing(true)
}
}
extension KeyboardController: UIGestureRecognizerDelegate {
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return !isKeyboardHidden
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment