Last active
November 23, 2020 08:29
-
-
Save ahbo/7b4f26979e2c248df32f2b9926f3a686 to your computer and use it in GitHub Desktop.
Making views keyboard aware. Add this class to your project then in the Storyboard, create a bottom constraint for the View and in the Identity Inspector, change its class to KeyboardLayoutConstraint. Done.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // | |
| import UIKit | |
| #if !os(tvOS) | |
| @available(tvOS, unavailable) | |
| public class KeyboardLayoutConstraint: NSLayoutConstraint { | |
| private var offset : CGFloat = 0 | |
| private var keyboardVisibleHeight : CGFloat = 0 | |
| @available(tvOS, unavailable) | |
| override public func awakeFromNib() { | |
| super.awakeFromNib() | |
| offset = constant | |
| NotificationCenter.default.addObserver(self, selector: #selector(KeyboardLayoutConstraint.keyboardWillShowNotification(_:)), name: UIWindow.keyboardWillShowNotification, object: nil) | |
| NotificationCenter.default.addObserver(self, selector: #selector(KeyboardLayoutConstraint.keyboardWillHideNotification(_:)), name: UIWindow.keyboardWillHideNotification, object: nil) | |
| } | |
| deinit { | |
| NotificationCenter.default.removeObserver(self) | |
| } | |
| // MARK: Notification | |
| @objc func keyboardWillShowNotification(_ notification: Notification) { | |
| if let userInfo = notification.userInfo { | |
| if let frameValue = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue { | |
| let frame = frameValue.cgRectValue | |
| keyboardVisibleHeight = frame.size.height | |
| } | |
| self.updateConstant() | |
| switch (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber, userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber) { | |
| case let (.some(duration), .some(curve)): | |
| let options = UIView.AnimationOptions(rawValue: curve.uintValue) | |
| UIView.animate( | |
| withDuration: TimeInterval(duration.doubleValue), | |
| delay: 0, | |
| options: options, | |
| animations: { | |
| UIApplication.shared.keyWindow?.layoutIfNeeded() | |
| return | |
| }, completion: { finished in | |
| }) | |
| default: | |
| break | |
| } | |
| } | |
| } | |
| @objc func keyboardWillHideNotification(_ notification: NSNotification) { | |
| keyboardVisibleHeight = 0 | |
| self.updateConstant() | |
| if let userInfo = notification.userInfo { | |
| switch (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber, userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber) { | |
| case let (.some(duration), .some(curve)): | |
| let options = UIView.AnimationOptions(rawValue: curve.uintValue) | |
| UIView.animate( | |
| withDuration: TimeInterval(duration.doubleValue), | |
| delay: 0, | |
| options: options, | |
| animations: { | |
| UIApplication.shared.keyWindow?.layoutIfNeeded() | |
| return | |
| }, completion: { finished in | |
| }) | |
| default: | |
| break | |
| } | |
| } | |
| } | |
| func updateConstant() { | |
| self.constant = offset + keyboardVisibleHeight | |
| } | |
| } | |
| #endif | |
| // The MIT License (MIT) | |
| // | |
| // Copyright (c) 2015 James Tang ([email protected]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment