我想在显示键盘时自定义滚动偏移量。正如您在GIF中所看到的,“文本字段”非常靠近键盘,我想拥有一个自定义位置。“名称”文本字段的距离应增加50px,而“贷款标题”文本字段应滚动到我的UIScrollView的底部。
为了能够滚动通过键盘,我正在更改UIScrollView
插图。奇怪的是,iOS会自动滚动到firstResponder文本字段(请参见GIF)。
override func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
}
@objc func keyboardWillShow(notification: NSNotification) {
// get the Keyboard size
let userInfo = notification.userInfo!
let keyboardEndFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
// update edge insets for scrollview
self.mainScrollView.scrollIndicatorInsets.bottom = keyboardEndFrame.height - self.view.layoutMargins.bottom
self.mainScrollView.contentInset.bottom = keyboardEndFrame.height - self.view.layoutMargins.bottom
}
我已经尝试使用该UITextfieldDelegate
方法:textFieldDidBeginEditing(_ textField: UITextField)
我也尝试使用此处描述的Apple方法:https : //stackoverflow.com/a/28813720/7421005
这些方式都不能让我自定义自动滚动位置。实际上,它会覆盖所有尝试。有谁知道解决此问题的方法?
我自己找到了解决方案。问题是自动滚动(动画)干扰了我的scrollRectToVisible
通话。将其置于异步状态可解决此问题。
现在看起来与此类似:
override func viewDidLoad() {
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
}
@objc func keyboardWillShow(notification: NSNotification) {
// get the Keyboard size
let userInfo = notification.userInfo!
let keyboardEndFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
// update edge insets for scrollview
self.mainScrollView.scrollIndicatorInsets.bottom = keyboardEndFrame.height - self.view.layoutMargins.bottom
self.mainScrollView.contentInset.bottom = keyboardEndFrame.height - self.view.layoutMargins.bottom
var frame = CGRect.zero
if nameTextField.isFirstResponder {
frame = CGRect(x: nameTextField.frame.origin.x, y: nameTextField.frame.origin.y + 50, width: nameTextField.frame.size.width, height: nameTextField.frame.size.height)
}
if titleTextField.isFirstResponder {
frame = CGRect(x: titleTextField.frame.origin.x, y: titleTextField.frame.origin.y + titleShortcutsCollectionView.frame.height + 25, width: titleTextField.frame.size.width, height: titleTextField.frame.size.height)
}
DispatchQueue.main.async {
self.mainScrollView.scrollRectToVisible(frame, animated: true)
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句