If you don't want to use auto layout and wants textfield to go up when keyboard appears then use UIScrollView.
and use following code. make sure you change it according to your text fields
call this function registerforkeyboardnotifiations from your viewdidload
lazy var securityScrollView = UIScrollView()
var activeTextField = UITextField()
var testTextField = UITextField()
//call setup screen from viewdidload
func setUpScreen {
view.addSubview(securityScrollView)
// adding textfield to scroll view
securityScrollView.addSubview(testTextField)
// make sure to setup constraints. for textfield and scrollview
}
/// here I am setting my activekeyboard
public func textFieldDidBeginEditing(_ textField: UITextField) {
activeTextField = textField
}
func registerForKeyboardNotifications() {
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardAppear(_:)), name: UIResponder.keyboardDidShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisappear(_:)), name: UIResponder.keyboardDidHideNotification, object: nil)
}
@objc func onKeyboardAppear(_ notification: NSNotification) {
let info = notification.userInfo!
let rect: CGRect = info[UIResponder.keyboardFrameBeginUserInfoKey] as! CGRect
let kbSize = rect.size
let insets = UIEdgeInsets(top: 0, left: 0, bottom: kbSize.height+120, right: 0) // bottom constants change according to your needs
self.securityScrollView.contentInset = insets
self.securityScrollView.scrollIndicatorInsets = insets
var visibleRect: CGRect = self.securityScrollView.convert(self.securityScrollView.bounds, to: self.view)
visibleRect.size.height -= rect.size.height;
let inputRect: CGRect = self.activeTextField.convert(self.activeTextField.bounds, to: self.securityScrollView)
if (visibleRect.contains(inputRect)) {
self.securityScrollView.scrollRectToVisible(inputRect, animated: true)
}
}
@objc func onKeyboardDisappear(_ notification: NSNotification) {
self.securityScrollView.contentInset = UIEdgeInsets.zero
self.securityScrollView.scrollIndicatorInsets = UIEdgeInsets.zero
}
make sure you are removing observer and best place to do it is in deist if you are using view controller
deinit {
NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardDidShowNotification, object: nil)
NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardDidHideNotification, object: nil)
}
If you want to setup your scrollview refer this
public override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
securityScrollView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.height + kPaddig)
securityScrollView.isScrollEnabled = true
securityScrollView.showsVerticalScrollIndicator = false
}
change active textfield for your text field
var activeTextField = UITextField()
Make changes according to your scrollview and textbook. Enjoy!