在编辑具有约束条件的多个文本字段时移动键盘
我有一个看起来像这样的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