简体   繁体   English

出现键盘时移动视图,并将其显示在scrollView中。 迅捷3

[英]Move View when keyboard appears and present it in a scrollView. Swift 3

There are several similar questions on SO but non addresses the issue below. 关于SO有几个类似的问题,但以下未解决。

I'm working on a simple login view with just 2 textFields for email and password. 我正在使用一个只有2个textFields的电子邮件和密码的简单登录视图。 The best UX is when a user taps one of the textFields, the keyboard pops in, and the view moves up, while becoming a scrollView. 最好的UX是当用户单击textFields之一时,弹出键盘,并且视图向上移动,同时成为scrollView。 This way, a user can still see what other UI elements are on the screen. 这样,用户仍然可以看到屏幕上还有哪些其他UI元素。 User should also be able to hide the keyboard by swiping down. 用户还应该可以通过向下滑动来隐藏键盘。 (Instagram and other big boys have this implemented) (Instagram和其他大男孩已经实施了此功能)

I was able to built a view without a scrollView and dismiss the keyboard by resignFirstResponder: 我能够在没有scrollView的情况下构建视图,并通过resignFirstResponder关闭键盘:

class SignInVC: UIViewController, UITextFieldDelegate {

@IBOutlet weak var pwdField: UITextField!
@IBOutlet weak var emailField: UITextField!
@IBOutlet weak var scrollView: UIScrollView!

var keyboardDismissTapGesture: UIGestureRecognizer?

func dismissKeyboard(sender: AnyObject) {
    pwdField?.resignFirstResponder()
    emailField?.resignFirstResponder()
}

override func viewDidLoad() {
    super.viewDidLoad()        
}

override func viewDidAppear(_ animated: Bool) {

    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

func keyboardWillShow(notification: NSNotification) {

    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y == 0{
            self.view.frame.origin.y -= keyboardSize.height  
        }
    }

    if keyboardDismissTapGesture == nil
    {
        keyboardDismissTapGesture = UITapGestureRecognizer(target: self,
                                                           action: #selector(self.dismissKeyboard))
        self.view.addGestureRecognizer(keyboardDismissTapGesture!)
    }
}

func keyboardWillHide(notification: NSNotification) {

    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y != 0{
            self.view.frame.origin.y += keyboardSize.height
        }
    }

    if keyboardDismissTapGesture != nil
    {
        self.view.removeGestureRecognizer(keyboardDismissTapGesture!)
        keyboardDismissTapGesture = nil
    }
}

override func viewWillDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self)

    super.viewWillDisappear(animated)
}

I was trying to play around with scrollView.contentSize trying to also move its origin: scrollView.frame.origin.y -= keyboardSize.height 我正在尝试使用scrollView.contentSize尝试也移动其原点: scrollView.frame.origin.y -= keyboardSize.height

or its contentSize: scrollView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.height - keyboardSize.height) 或其contentSize: scrollView.contentSize = CGSize(width: self.view.frame.width, height: self.view.frame.height - keyboardSize.height)

but nothing worked. 但没有任何效果。

Regarding the keyboard's ability to be swiped down, there was information that in scrollView's attribute inspector, I could change the "Keyboard" property to "Dismiss Interactively". 关于键盘的向下滑动功能,有一些信息表明,在scrollView的属性检查器中,我可以将“键盘”属性更改为“以交互方式关闭”。 Didn't work. 没用

// declare a uitextfield which holds your activetextfiled //声明一个uitextfield来保存您的activetextfiled

var activeTextField:UITextField!

// add keyboard dismiss tap gesture in your viewdidload //在您的viewdidload中添加键盘消除点击手势

override func viewDidLoad() {
    super.viewDidLoad()   
 keyboardDismissTapGesture = UITapGestureRecognizer(target: self,                                                           action:      #selector(self.dismissKeyboard))     
}

// set active text field in textfield did begin delegte //在textfield中设置活动文本字段确实开始委托

func textFieldDidBeginEditing(textField: UITextField) {
activeTextField  = textField

    }

func textFieldDidEndEditing(textField: UITextField) {

  activeTextField  = nil
}

// dismiss keyboard for the activeTextField //关闭activeTextField的键盘

func dismissKeyboard(){
   activeTextField.resignFirstResponder()
}

// adjust scrollview content size when keyboard will show //调整键盘显示时滚动内容的大小

func keyboardWillShow(notification:NSNotification){

    var userInfo = notification.userInfo!
    var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue()
    keyboardFrame = self.view.convertRect(keyboardFrame, fromView: nil)

    var contentInset:UIEdgeInsets = self.scrollView.contentInset
    contentInset.bottom = keyboardFrame.size.height
    self.scrollView.contentInset = contentInset
}

// reset scrollview when keyboard will go //重设scrollview何时键盘将进入

func keyboardWillHide(notification:NSNotification){

    let contentInset:UIEdgeInsets = UIEdgeInsetsZero
    self.scrollView.contentInset = contentInset
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM