仅当键盘出现在 swift 时如何使 scrollView 滚动

How to make scrollView scrolling only if keyboard appears in swift

我将 scrolview 用于高度为 1000 的视图,最初我不希望我的 scrolView 滚动。如果我点击任何 textField,那么我希望我的 scrolview 滚动,如果我 return 键盘那么我不希望我的 scrolview 滚动。

在这里,当键盘出现时,我可以将文本字段向上,但是当我 return 键盘出现时,我无法 return 文本字段到其原始位置,而当我 return 键盘出现时,我无法 return 文本字段想让我的视图滚动,

请帮我写代码。

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
}
}

最初我不想滚动,如果我 return 键盘我需要文本字段回到原来的位置并且不再滚动。

只有键盘出现然后我才需要滚动。请在代码中帮助我。

在视图中会出现

 yourScrollview.isScrollEnabled = false

出现键盘后进行true

 yourScrollview.isScrollEnabled = true

或者您可以使用 IQKeyboard 管理器来处理 textfields.Checkout:IQKeyboardManager

您只需要在隐藏键盘后立即设置 ScrollView 的 contentOffset。

创建一个变量来存储offsetBeforeShowKeyboard

var offsetBeforeShowKeyboard: CGFloat?

最初加载视图时:

self.scrollView.isScrollEnabled = false

当 select 任何 TextField:

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
 }