晚上,我有几个UITextfield
的应用程序,就像我一样,当我按下文本字段时,我有键盘的位置问题。
我知道我必须与代表和textFieldDidBeginEditing func
一起解决问题,以便向上移动250
的文本字段而不是向下移动。
但通常我用简单的布局做到了,在这一个中有几个嵌套stack views
,我真的不知道如何解决这个问题。我读过我应该使用scroll view
,我已经尝试了但它搞砸了所有的布局。提示?我非常喜欢编码方面的挑战,但是当它涉及布局时,仇恨就会出现在外面,我的大脑就会冻结。
1在所有
之上添加屏幕大小的视图2将约束添加到新视图
前沿等于superview的前沿。
底边等于superview的下边缘。
与superview相等的宽度。
与superview平等的高度。
3在subViews / StackViews
上进行正确的约束调整4在视图控制器
上设置所有带代理的文本字段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()
}
}
}
答案 0 :(得分:1)
尝试将整个布局放在屏幕大小的视图中,然后在键盘出现时将该视图向上移动适当的数量。
拖出UIView
并将其放在顶级视图中。将其大小调整为屏幕大小。
设置4个约束:
在底部约束中创建@IBOutlet
。键盘出现后,设置bottomConstraint.constant = 250
以向上移动视图。将其重新设置为0
以将其再次向下移动。您可能需要constant
的负值,具体取决于约束中项目的排序。
要为移动设置动画,请在layoutIfNeeded
的块中的self.view
上致电UIView.animateWithDuration
:
bottomContraint.constant = 250
UIView.animateWithDuration(1.0) {
self.view.layoutIfNeeded()
}