编辑带有约束的多个文本字段时移动键盘 swift
Moving keyboard when editing multiple textfields with constraints swift
我有 UIViewController
看起来像这样:
相关的我都设置了constraints
.
我试图在键盘出现时向上移动 UIView
- 当我点击下面的 UITextfields
时。
我有以下代码:
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)
}
}
我面临的问题是 -
但是,当我点击第二个时,它又移动了,现在它看起来像这样:
我注意到如果删除约束,问题就会消失,但是,我确实需要使用约束。
那么,我在这里缺少什么?
您必须为您的 uiview 控制器使用 scrollview,然后您可以使用通知来调整您的 uiview 约束。
你的 UIViewController 层次结构应该是这样的
ContainerView --> ScrollView --> 内容视图 --> 现在是您的视图。
我建议您将 pod 'TPKeyboardAvoiding' 用于滚动视图中的未来动画,因为对于每个控制器,您不想将通知用于移动 UIView。
这是 link UIView 移动演示 https://github.com/Vasu05/ScrollViewExample
我有 UIViewController
看起来像这样:
相关的我都设置了constraints
.
我试图在键盘出现时向上移动 UIView
- 当我点击下面的 UITextfields
时。
我有以下代码:
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)
}
}
我面临的问题是 -
但是,当我点击第二个时,它又移动了,现在它看起来像这样:
我注意到如果删除约束,问题就会消失,但是,我确实需要使用约束。
那么,我在这里缺少什么?
您必须为您的 uiview 控制器使用 scrollview,然后您可以使用通知来调整您的 uiview 约束。
你的 UIViewController 层次结构应该是这样的
ContainerView --> ScrollView --> 内容视图 --> 现在是您的视图。
我建议您将 pod 'TPKeyboardAvoiding' 用于滚动视图中的未来动画,因为对于每个控制器,您不想将通知用于移动 UIView。
这是 link UIView 移动演示 https://github.com/Vasu05/ScrollViewExample