当键盘可见时,UIScrollView滚动到按钮

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当键盘可见时,UIScrollView滚动到按钮相关的知识,希望对你有一定的参考价值。

我的ios应用程序中有一个非常基本的登录表单。我通常实现的典型行为是注册键盘通知并处理UIScrollView的滚动行为,以显示当前聚焦的UITextField。但是这次我需要一个稍微不同的行为。

如果键盘显示我想滚动滚动视图,那么提交按钮将显示在键盘正上方并且可见。

我知道推荐的方法是使用contentInsets,但这对我来说似乎失败了。我得到了设置contentOffset的工作,但我希望看到更好的解决方案来解决这个问题。

这是我目前的代码:

func keyboardWillShow(notification: Notification) {
    guard let userInfo: NSDictionary = notification.userInfo as NSDictionary?,
    let keyboardInfo = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue else {
        return
    }
    let keyboardSize = keyboardInfo.cgRectValue.size

    guard let loginButton = loginButton else {
        return
    }
    let buttonOrigin: CGPoint = loginButton.convert(loginButton.bounds, to: self).origin
    let buttonHeight: CGFloat = loginButton.bounds.size.height
    var visibleRect = self.frame
    visibleRect.size.height -= keyboardSize.height

    if !visibleRect.contains(buttonOrigin) {
        let scrollPoint = CGPoint(x: 0.0, y: buttonOrigin.y - visibleRect.size.height + buttonHeight)
        scrollView.setContentOffset(scrollPoint, animated: true)
    }
}
答案

你有以下方式尝试吗?

func keyboardWillShow(notification: Notification) {
    self.scrollView.isScrollEnabled = true
    let contentInsets = UIEdgeInsetsMake(0.0, 0.0, self.keyboardSize.height, 0.0)
    self.scrollView.contentInset = contentInsets
    self.scrollView.scrollIndicatorInsets = contentInsets
    var rect = self.view.frame
    rect.size.height -= self.keyboardSize.height
    if !rect.contains(self.loginButton.frame.origin) {
        self.scrollView.scrollRectToVisible(self.loginButton.frame, animated: true)
    }
}

经过几个小时的尝试,这就是我在应用程序中滚动的方式。

以上是关于当键盘可见时,UIScrollView滚动到按钮的主要内容,如果未能解决你的问题,请参考以下文章

当 UIScrollView 在可见视图之外滚动按钮时更改 UIButton textLabel 位置

键盘可见的 UIScrollView

为啥显示键盘时 UIScrollView 不滚动?

UIScrollView 的内容偏移被重置

键盘出现时如何滚动 UIScrollView?

键盘出现时的UIScrollView