var keyboardIsShowing = false
override func viewDidAppear(_ animated: Bool) {
NotificationCenter.default.addObserver(self, selector:
#selector(keyboardDidShow),
name: Notification.Name.UIKeyboardDidShow, object: nil)
NotificationCenter.default.addObserver(self, selector:
#selector(keyboardWillHide),
name: Notification.Name.UIKeyboardWillHide, object: nil)
}
override func viewWillDisappear(_ animated: Bool) {
NotificationCenter.default.removeObserver(self,
name: Notification.Name.UIKeyboardDidShow, object: self)
NotificationCenter.default.removeObserver(self,
name: Notification.Name.UIKeyboardWillHide, object: self)
}
Not In A Scroll View
@objc
func keyboardDidShow(notification: NSNotification) {
if keyboardIsShowing { return }
let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
keyBoardIsShowing = true
var newFrame = self.view.frame
newFrame.origin.y -= keyboardSize.height
self.view.frame = newFrame
}
@objc
func keyboardWillHide(notification: NSNotification) {
let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
keyboardIsShowing = false
var newFrame = self.view.frame
newFrame.origin.y += keyboardSize.height
}
Note: While this works fine, I always had trouble getting it to show smoothly or even animate it. It is choppy. As of this date I recommend just putting your view in a scroll view and using the below methods for a smoother look and feel.
In A Scroll View
@IBOutlet weak var scrollView: UIScrollView!
@objc
func keyboardDidShow(notification: NSNotification) {
if keyboardIsShowing { return }
let keyboardSize = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.size
keyboardIsShowing = true
let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)
scrollView.contentInset = contentInsets
scrollView.scrollIndicatorInsets = contentInsets
// OPTIONAL: When you want bottom of a view to rest on the top of the keyboard.
let viewBottom = myView.frame.origin.y + myView.frame.height
let keyboardTop = view.bounds.height - keyboardSize.height
if viewBottom > keyboardTop {
let y = viewBottom - keyboardTop + 5
scrollView.setContentOffset(CGPoint(x: 0, y: y), animated: true)
}
}
@objc
func keyboardWillHide(notification: NSNotification) {
keyboardIsShowing = false
let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
scrollView.contentInset = contentInsets
scrollView.scrollIndicatorInsets = contentInsets
}
(Xcode 9, Swift 4)







