如何快速在 UITableView 中的键盘上方滚动 UITextView

Posted

技术标签:

【中文标题】如何快速在 UITableView 中的键盘上方滚动 UITextView【英文标题】:How to scroll UITextView above Keyboard in a UITableView in swift 【发布时间】:2015-02-03 10:50:09 【问题描述】:

我为 Objective-c 找到了这个解决方案:Scroll UITextField above Keyboard in a UITableViewCell on a regular UIViewController,但我无法将其调整为 swift。

func textViewShouldBeginEditing(textView: UITextView) -> Bool 
    var pointInTable:CGPoint? =  textView.superview?.convertPoint(textView.frame.origin, toView: tableView)
    var contentOffset:CGPoint = tableView.contentOffset
    contentOffset.y  = pointInTable?.y - textView.inputAccessoryView?.frame.size.height

我得到错误:

Value of optional type 'CGFloat?' not unwrapped; did you mean to use '!' or '?'?  

当我使用 !或者 ?我得到错误: 后缀 '?' 的操作数应该有可选类型;类型是'CGFloat'

【问题讨论】:

【参考方案1】:

这是避免代码错误的一种方法:

func textViewShouldBeginEditing(textView: UITextView) -> Bool 
    var pointInTable:CGPoint = textView.superview!.convertPoint(textView.frame.origin, toView: tableView)
    var contentOffset:CGPoint = tableView.contentOffset
    contentOffset.y  = pointInTable.y
    if let accessoryView = textView.inputAccessoryView 
        contentOffset.y -= accessoryView.frame.size.height
    
    tableView.contentOffset = contentOffset
    return true

首先,我们可以假设textView 有一个superview,所以我们可以用! 解开它。 因此,pointInTable 不再是可选的。 如果我们假设textView 可能没有inputAccessoryView,我们可以使用典型的if let 语法来检查inputAccessoryView 是否存在,如果存在,则从contentOffset.y 中减去它的高度。 不要忘记将contentOffset 分配给您的tableView 并返回Bool

【讨论】:

它移动太多了..我可以把移动的距离缩小一点吗?? @SaiPavanParanam 绝对!请尝试不同的contentOffset 值,直到找到最适合您的值。 @Para 很好的答案 @Para 此代码将我的文本视图滚动到屏幕的最顶部,而不是键盘上方。你能建议如何解决这个问题吗?我知道我可以向 contentOffset 添加静态数字,但我更感兴趣的是找出为什么您的代码没有将它完全放在键盘上方? @SaiPavanParanam 你发现了吗?

以上是关于如何快速在 UITableView 中的键盘上方滚动 UITextView的主要内容,如果未能解决你的问题,请参考以下文章

键盘上方的 UIToolbar - iPhone SDK

将自定义 UITableViewCell 滚动到键盘上方?

如何在 UITableView 上方添加 UIImage

如何测试键盘是不是覆盖 UITableView 中的 UITextField?

是否有任何通用解决方案可以在屏幕上的键盘上方滚动 UITextView 和 UITextField

快速消息应用程序,uitableview 无法正确响应键盘?