【问题标题】:How to scroll UITextView above Keyboard in a UITableView in swift如何快速在 UITableView 中的键盘上方滚动 UITextView
【发布时间】: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'

【问题讨论】:

    标签: ios swift


    【解决方案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 你发现了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多