在编辑具有约束条件的多个文本字段时移动键盘 [英] Moving keyboard when editing multiple textfields with constraints swift

查看:118
本文介绍了在编辑具有约束条件的多个文本字段时移动键盘的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个看起来像这样的UIViewController:

I have UIViewController which looks like this:

我设置了所有相关的constraints.

当键盘出现时-我单击下面的UITextfields时,我试图将UIView向上移动.

I'm trying to shift the UIView up when the keyboard shows up - when I click on the UITextfields below.

我有以下代码:

static func addRemoveKeyboardObserver(addObserver: Bool, keyboardMargin: CGFloat, view: UIView?)
{
    Utils.keyboardMargin = keyboardMargin
    Utils.heightChangingView = view

    if addObserver
    {
        NotificationCenter.default.addObserver(self, selector: #selector(Utils.keyboardWillChange(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(Utils.keyboardWillChange(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(Utils.keyboardWillChange(notification:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
    }
    else
    {
        NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
        NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillChangeFrameNotification, object: nil)

        Utils.keyboardHeight = 0
    }
}

@objc static func keyboardWillChange(notification: Notification)
{
    let userInfo = notification.userInfo!
    let beginFrameValue = (userInfo[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)!
    let beginFrame = beginFrameValue.cgRectValue

    let viewShouldMove = notification.name == UIResponder.keyboardWillShowNotification || notification.name == UIResponder.keyboardWillChangeFrameNotification 

    if Utils.keyboardHeight == 0 { Utils.keyboardHeight = -beginFrame.height + Utils.keyboardMargin }

    let duration:TimeInterval = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
    let animationCurveRawNSN = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
    let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
    let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)

    if let view = Utils.heightChangingView
    {
        view.frame.origin.y = viewShouldMove ? Utils.keyboardHeight : 0
        UIView.animate(withDuration: duration, delay: TimeInterval(0), options: animationCurve,                                               animations: { view.layoutIfNeeded() }, completion: nil)
    }
}

我面临的问题是-

但是,当我单击第二个时,它再次移动,现在看起来像这样:

But then, when I click the second one, it shifts again, and now it looks like this:

我注意到,如果删除约束,问题就消失了,但是,我确实需要使用约束.

I noticed that if I remove the constraints, the issue goes away, however, I do need to use the constraints.

那么,我在这里想念什么?

So, what am I missing here?

推荐答案

您必须将Scrollview用于uiview控制器,然后才能使用通知来调整uiview约束.

You must use scrollview for your uiview controller and then you can use notification for adjusting your uiview constraint.

您的UIViewController层次结构应为

Your UIViewController hierarchy should be like this

ContainerView-> ScrollView->内容视图->现在就是您的视图.

ContainerView --> ScrollView --> Content View --> Now Your View.

我建议您对滚动视图中的未来动画使用pod'TPKeyboardAvoiding',因为对于每个控制器,您都不想将通知放到移动UIView的位置.

I'm suggesting you to use pod 'TPKeyboardAvoiding' for future animations in scrollview since for every controller you don't want to put notifications to shifting your UIView.

这是您的UIView转换的链接演示 https://github.com/Vasu05/ScrollViewExample

Here is link demo for your UIView shifting https://github.com/Vasu05/ScrollViewExample

这篇关于在编辑具有约束条件的多个文本字段时移动键盘的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆