iOS键盘和Textfields

时间:2016-08-21 13:58:42

标签: ios swift keyboard uitextfield

晚上,我有几个UITextfield的应用程序,就像我一样,当我按下文本字段时,我有键盘的位置问题。

我知道我必须与代表和textFieldDidBeginEditing func一起解决问题,以便向上移动250的文本字段而不是向下移动。

但通常我用简单的布局做到了,在这一个中有几个嵌套stack views,我真的不知道如何解决这个问题。我读过我应该使用scroll view,我已经尝试了但它搞砸了所有的布局。提示?我非常喜欢编码方面的挑战,但是当它涉及布局时,仇恨就会出现在外面,我的大脑就会冻结。

The Layout of the App

解决方案:

在自动布局

1在所有

之上添加屏幕大小的视图

2将约束添加到新视图

  • 前沿等于superview的前沿。

  • 底边等于superview的下边缘。

  • 与superview相等的宽度。

  • 与superview平等的高度。

3在subViews / StackViews

上进行正确的约束调整

4在视图控制器

上设置所有带代理的文本字段

在代码中 - ViewController

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var mainViewBottomConstraint: NSLayoutConstraint!
    var activeField: UITextField?

    override func viewDidLoad() {
          super.viewDidLoad()

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


    }
//we are tracking the Field we are working on
func textFieldDidBeginEditing(_ textField: UITextField) {
        activeField = textField
    }

    func textFieldDidEndEditing(_ textField: UITextField)
    {
        activeField = nil
    }

    func keyboardWillShow(notification: NSNotification) {
        if let userInfoDict = notification.userInfo, let keyboardFrameValue = userInfoDict[UIKeyboardFrameEndUserInfoKey] as? NSValue {
            let keyboardFrame = keyboardFrameValue.cgRectValue

            //The view will scroll up only for the following textfield

            if activeField == zipCodetext || activeField == cityText || activeField == streetAddresstext || activeField == stateText {

                UIView.animate(withDuration: 0.8) {
                    self.mainViewBottomConstraint.constant = keyboardFrame.size.height
                    self.view.layoutIfNeeded()
                }
            }

        }
    }

    func keyboardWillHide(notification: NSNotification) {
        UIView.animate(withDuration: 0.8) {
            self.mainViewBottomConstraint.constant = 0
            self.view.layoutIfNeeded()
        }
    }
}

感谢@vacawama

1 个答案:

答案 0 :(得分:1)

尝试将整个布局放在屏幕大小的视图中,然后在键盘出现时将该视图向上移动适当的数量。

拖出UIView并将其放在顶级视图中。将其大小调整为屏幕大小。

设置4个约束:

  1. 前缘等于superview的前沿。
  2. 底边等于superview的底边。
  3. 与superview相等的宽度。
  4. 与superview平等的高度。
  5. 在底部约束中创建@IBOutlet。键盘出现后,设置bottomConstraint.constant = 250以向上移动视图。将其重新设置为0以将其再次向下移动。您可能需要constant的负值,具体取决于约束中项目的排序。

    要为移动设置动画,请在layoutIfNeeded的块中的self.view上致电UIView.animateWithDuration

    bottomContraint.constant = 250
    UIView.animateWithDuration(1.0) {
        self.view.layoutIfNeeded()
    }