在显示键盘时,保持UITextView在UITableView中的可见性

时间:2016-05-12 03:10:10

标签: ios swift uitableview keyboard

我正在动态构建一个表单,每个UITableViewCell都有各种类型的UI元素。

有一个UITableViewCell包含UITextView,我希望能够在显示键盘时保持可见性。我看过其他类似的问题,但一直无法找到解决方案。

我写了推荐的Swift版本:Apple's Managing Keyboard

这有两个原因无效。 1.)键盘通知在TextViewWillBeginEditing之前触发。 2.)UITextView的框架与超级视图相关,即UITableViewCell,因此检查错误。

这是我目前的代码:

func adjustTableViewForKeyboard(notification: NSNotification) {
        let userInfo = notification.userInfo!

        let keyboardScreenEndFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue()
        let keyboardViewEndFrame = view.convertRect(keyboardScreenEndFrame, fromView: view.window)

        if notification.name == UIKeyboardWillHideNotification {
            self.tableView.contentInset = UIEdgeInsetsZero
        } else {
            self.tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyboardViewEndFrame.height, right: 0)

            rect = self.view.frame;
            rect!.size.height -= keyboardViewEndFrame.height

        }
        self.tableView.scrollIndicatorInsets = self.tableView.contentInset

    }


func textViewDidBeginEditing(textView: UITextView) {
        self.activeTextView = textView;

        if(activeTextView != nil){
            // This check does NOT work due to the TextView's superview is the cell.
            if(!CGRectContainsPoint(rect!, (activeTextView?.frame.origin)!)){
                self.tableView.scrollRectToVisible((activeTextView?.frame)!, animated: true)
            }

        }
    }

这可以滚动到所有单元格,但我也想确保UITextView不被键盘隐藏。

2 个答案:

答案 0 :(得分:1)

您可以使用响应者链来解决此问题。在通知处理程序中,尝试在文本视图中调用isFirstResponder();如果它返回true,那么你可以从那里调用表视图滚动代码。

答案 1 :(得分:0)

我有一个与我正在构建的(尽管是静态单元格)形式类似的问题,我能够使用scrollToRowAtIndexPath方法更新tableview的行定位以保持我的文本视图在屏幕上。

func textViewDidBeginEditing(textView: UITextView) {
    if textView == notesTextView {
        tableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 3), atScrollPosition: .Top, animated: true)
    }
}

它确实需要知道索引路径部分/行和文本视图参考,如果是倍数,但可能有用吗?

scrollRectToVisible也应该可以工作,但听起来你必须首先使用convertRect:toView或类似的方法将textview的框架转换为scrollview的坐标系。

希望这会有所帮助 - 干杯。