UITextView 避免键盘滚动

Posted

技术标签:

【中文标题】UITextView 避免键盘滚动【英文标题】:UITextView avoid keyboard scrolling 【发布时间】:2016-05-31 12:07:02 【问题描述】:

我创建了UIScrollView 的扩展,当用户选择一个文本字段并出现键盘时,如果文本字段挡住键盘,它将向上滚动。我让它适用于UITextField,但它似乎不适用于UITextView。我在 *** 上搜索了很多帖子,但似乎找不到任何帮助。这是扩展的代码:

extension UIScrollView 

func respondToKeyboard() 
    self.registerForKeyboardNotifications()



func registerForKeyboardNotifications() 
    // Register to be notified if the keyboard is changing size i.e. shown or hidden
    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: #selector(keyboardWasShown(_:)),
        name: UIKeyboardWillShowNotification,
        object: nil
    )
    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: #selector(keyboardWillBeHidden(_:)),
        name: UIKeyboardWillHideNotification,
        object: nil
    )


func keyboardWasShown(notification: NSNotification) 
    if let info = notification.userInfo,
        keyboardSize = info[UIKeyboardFrameBeginUserInfoKey]?.CGRectValue.size 

        self.contentInset.bottom = keyboardSize.height + 15
        self.scrollIndicatorInsets.bottom = keyboardSize.height

        var frame = self.frame
        frame.size.height -= keyboardSize.height
    


func keyboardWillBeHidden(notification: NSNotification) 
    self.contentInset.bottom = 0
    self.scrollIndicatorInsets.bottom = 0

在我的视图控制器中,我将其设置为:

scrollView.respondToKeyboard()

有人可以指出我如何将UITextView 作为扩展以在键盘挡住时向上移动的正确方向吗?

【问题讨论】:

【参考方案1】:

您可以尝试使用 UITextView 委托方法。查看此link 了解更多详情。如需快速,请查看教程here。

【讨论】:

感谢您的链接。所以现在我有 UIScrollView 的扩展名,我应该更改扩展名,使其成为 UITextViewUITextField 的扩展名吗? @ios 极客 只是认为这可能是一种更好的方法 @coderdojo - 如果您在视图控制器中使用委托处理键盘,则不需要扩展。 我想将它用作扩展,这样我就不会在我拥有的每个视图控制器中重复相同的代码,这有意义吗? @iOS 极客【参考方案2】:

对我来说,这个解决方案适用于 UITextView。也许你可以为 Scrollview 更新这个

// keyboard visible??
lazy var keyboardVisible = false
// Keyboard-Height
lazy var keyboardHeight: CGFloat = 0

func updateTextViewSizeForKeyboardHeight(keyboardHeight: CGFloat) 
    textView.contentInset.bottom = keyboardHeight
    self.keyboardHeight = keyboardHeight


func keyboardDidShow(notification: NSNotification) 
    if let rectValue = notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue 
        if  keyboardVisible == false 
            let keyboardSize = rectValue.CGRectValue().size
            keyboardVisible = true
            updateTextViewSizeForKeyboardHeight(keyboardSize.height)                
        
    


func keyboardDidHide(notification: NSNotification) 
    if keyboardVisible 
        keyboardVisible = false
        updateTextViewSizeForKeyboardHeight(0)
    

【讨论】:

以上是关于UITextView 避免键盘滚动的主要内容,如果未能解决你的问题,请参考以下文章

键盘附件视图隐藏文本

在 UITextView 编辑时移动 UIView

Swift 4 - 如何使用按钮启用/禁用键盘

显示键盘时 UITextView 不会滚动

如何将 UITableViewCell 中的 UITextView 滚动到键盘顶部?

当键盘可见时如何使 UITextView 一直滚动到底部