仅当键盘快速出现时如何使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 - 仅当用户未更改滚动位置时

出现键盘时Scrollview不滚动

Android开发里遇到键盘出现时ScrollView不能滚动,怎么解决

如何在快速向上或向下滚动时退出键盘? [关闭]

出现键盘时滚动到 SwiftUI Scrollview 的最底部

Fragment中的ScrollView在软键盘出现时不滚动