仅当键盘快速出现时如何使scrollView滚动
Posted
技术标签:
【中文标题】仅当键盘快速出现时如何使scrollView滚动【英文标题】:How to make scrollView scrolling only if keyboard appears in swift 【发布时间】:2020-03-02 16:43:46 【问题描述】:我正在使用 scrollview 来查看高度为 1000 的视图,最初我不希望我的 scrollView 滚动。如果我点击任何文本字段,那么我希望我的滚动视图滚动,如果我返回键盘,那么我不希望我的滚动视图滚动。
在这里,当键盘出现时,我可以向上显示文本字段,但是当我返回键盘时,我无法将文本字段返回到其原始位置,当我返回键盘时,我不希望我的视图滚动,
请帮我写代码。
class ViewController: UIViewController, UITextFieldDelegate
@IBOutlet weak var scrolView: UIScrollView!
@IBOutlet weak var upTFLD: UITextField!
var activeTextField = UITextField()
@IBOutlet weak var downTFLD: UITextField!
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
upTFLD.delegate = self
downTFLD.delegate = self
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardAppear(_:)), name: UIResponder.keyboardDidShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(onKeyboardDisappear(_:)), name: UIResponder.keyboardDidHideNotification, object: nil)
@objc func onKeyboardAppear(_ notification: NSNotification)
let info = notification.userInfo!
let rect: CGRect = info[UIResponder.keyboardFrameBeginUserInfoKey] as! CGRect
let kbSize = rect.size
let insets = UIEdgeInsets(top: 0, left: 0, bottom: kbSize.height+20, right: 0)
self.scrolView.contentInset = insets
self.scrolView.scrollIndicatorInsets = insets
var visibleRect: CGRect = self.scrolView.convert(self.scrolView.bounds, to: self.view)
visibleRect.size.height -= rect.size.height;
let inputRect: CGRect = self.activeTextField.convert(self.activeTextField.bounds, to: self.scrolView)
if (visibleRect.contains(inputRect))
self.scrolView.scrollRectToVisible(inputRect, animated: true)
@objc func onKeyboardDisappear(_ notification: NSNotification)
self.scrolView.contentInset = UIEdgeInsets.zero
self.scrolView.scrollIndicatorInsets = UIEdgeInsets.zero
public func textFieldDidBeginEditing(_ textField: UITextField)
activeTextField = textField
func textFieldShouldReturn(_ textField: UITextField) -> Bool
activeTextField.resignFirstResponder()
return true
最初我不想滚动,如果我返回键盘,我需要文本字段回到原来的位置并且不再滚动。
只有键盘出现然后只有我需要滚动。请在代码中帮助我。
【问题讨论】:
【参考方案1】:您只需要在键盘隐藏后立即设置 ScrollView 的 contentOffset。
创建一个变量来存储offsetBeforeShowKeyboard
var offsetBeforeShowKeyboard: CGFloat?
最初加载视图时:
self.scrollView.isScrollEnabled = false
选择任何文本字段:
public func textFieldDidBeginEditing(_ textField: UITextField)
self.scrollView.isScrollEnabled = true
if (self.offsetBeforeShowKeyboard == nil)
self.offsetBeforeShowKeyboard = self.scrollView.contentOffset
键盘隐藏时
@objc func onKeyboardDisappear(_ notification: NSNotification)
self.scrollView.isScrollEnabled = false
if let offset = self.offsetBeforeShowKeyboard
self.scrolView.setContentOffset(offset, animated: true)
self.offsetBeforeShowKeyboard = nil
【讨论】:
一个疑问,这里我给了 1000 个固定高度,但是我如何根据 iphone 屏幕大小改变它的高度.. 需要给出哪些约束? 我认为更好的实现是在你的 scrollView 和你的控制器的视图之间进行约束。如果您仍然想固定高度但取决于 iphone 屏幕尺寸,那么您需要检查设备型号并更新您的高度。 iphone型号检查,可以使用一些第三方,如:github.com/devicekit/DeviceKit【参考方案2】:在视图中会出现
yourScrollview.isScrollEnabled = false
键盘出现后,请输入true
yourScrollview.isScrollEnabled = true
或者,您可以使用 IQKeyboard 管理器来处理文本字段。结帐:IQKeyboardManager
【讨论】:
以上是关于仅当键盘快速出现时如何使scrollView滚动的主要内容,如果未能解决你的问题,请参考以下文章
如何自动滚动 ScrollViewer - 仅当用户未更改滚动位置时
Android开发里遇到键盘出现时ScrollView不能滚动,怎么解决