【问题标题】:UISrollView is desabled when keyboard hides in Swift当键盘在 Swift 中隐藏时 SCrollView 被禁用
【发布时间】:2019-01-18 19:41:57
【问题描述】:

我正在使用以下代码来解决 iOS 中键盘与 UITextField 重叠时的常见问题:

    @IBOutlet var scrollView: UIScrollView!

    var activeField: UITextField?

    override func viewWillAppear(_ animated:Bool) {
    super.viewWillAppear(animated)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
}

    func textFieldDidBeginEditing(_ textField: UITextField) {

    activeField = textField
}

func textFieldDidEndEditing(_ textField: UITextField) {

    activeField = nil
}

键盘通知

    func keyboardWillHide(_ notification: Notification) {

    var info = notification.userInfo!
    let keyboardSize = info[UIKeyboardFrameEndUserInfoKey] as? CGRect
    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, -keyboardSize!.height , 0.0)
    scrollView.contentInset = contentInsets
}

func keyboardWillShow(_ notification: Notification) {
    var info = notification.userInfo!
    let keyboardSize = info[UIKeyboardFrameEndUserInfoKey] as? CGRect
    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height + 8, 0.0)
    scrollView.contentInset = contentInsets
}

它就像魔法一样。

但我面临以下问题。当键盘在文本编辑后隐藏时,视图会回到之前的状态,应该是这样的,但是滚动被禁用。我不知道为什么..我设置了scrollView.isScrollEnabled = true,但这并没有解决我的问题。

我怎样才能摆脱这个?

【问题讨论】:

  • 您应该使用 IQKeyboaredManager 来处理视图,当使用 IQKeyboaredManager 出现键盘时,您将不需要处理它。 IQKeyboaredManager 会为您完成。

标签: ios swift uiscrollview uitextfield


【解决方案1】:

这一行是错误的(好吧,整个事情都是错误的,但这是你抱怨的那一行):

let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, -keyboardSize!.height, 0.0)

会更好

let contentInsets: UIEdgeInsets = .zero

更好的是,当键盘显示时,保存内容插图。当它隐藏时,将它们恢复为您保存的值。

【讨论】:

  • 如果我将 contentInsets 设置为 0,我的视图不会在 UITextField 结束编辑后立即反弹。就是这样
  • 这不是你问的。您抱怨键盘隐藏时滚动视图不再可滚动。我解释了为什么会这样。正如我在回答中所说,您的 整个 代码是错误的,因此不能像这样一次修改一行。
  • 如果你知道“正确”的代码,你可以分享一下吗? :)
  • 这个问题已经在 Stack Overflow 上进行了彻底的讨论和解释。我没有必要重复它。搜索!
猜你喜欢
  • 2023-03-22
  • 2019-06-08
  • 2013-08-20
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多