iOS版。 UITextView的。 UIKeyboardDidHideNotification后跳过文本

时间:2014-12-23 14:20:11

标签: ios iphone uitextview

我有可编辑的UITextView和键盘关闭模式是交互式的。此外,我的控制器正在收听两个通知:UIKeyboardWillShowNotificationUIKeyboardWillHideNotification

func keyboardWillShow(notification: NSNotification) {


    if let userInfo = notification.userInfo {

            var insets = self.textView.contentInset;
            let rect = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue() ?? CGRectZero
            insets.bottom = (rect.size.height - (CGRectGetHeight(self.view.frame) - CGRectGetMaxY(self.textView.frame)))
            self.textView.contentInset = insets
            self.textView.scrollIndicatorInsets = insets
    }
}


func keyboardWillHide(notification: NSNotification) {
        self.textView.contentInset = UIEdgeInsetsZero
        self.textView.scrollIndicatorInsets = UIEdgeInsetsZero 
}

如果UITextView中的文本不包含任何空行,这个东西效果很好。如果是这样,contentOffset会跳转到另一个随机位置。

我不确定这是iOS 7+中的错误,还是我做错了什么。 如果它不是一个错误,如何在没有跳跃行为的情况下顺利进行?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我一直在与这个完全相同的问题作斗争,当我解雇键盘时,UITextView的内容偏移将跳回{0, 0}。有趣的是,我只是在设备上有这种行为,而不是在模拟器中。

我最初尝试通过覆盖UITextView的contentOffset方法并让它忽略{0, 0}值来解决它,这是半有效的,直到内容太长,在这种情况下它只会跳转到一个随机偏移,并设置相同的值3次(因此它会快速连续地将内容偏移设置为{0, 3605}{0, 3605}{0, 3605}

经过很长一段时间寻找解决方案后,事实证明这很简单:

textview.layoutManager.allowsNonContiguousLayout = NO;

this blog post中所述。希望有所帮助:)

答案 1 :(得分:1)

我和你有100%完全相同的问题,我也问了一个问题,但没有人能说得对。 (我是那个投票赞成你的问题的人!)

经过4天的挫折,我最终做了一个解决方法。只需将UITextView放在UITableView内(您不需要将其放在UITableViewCell内,只需拖动到UITableView即可。)让您的UITextView不可滚动。

以下方法将使UITextView在每次更改时展开并更新UITableView。 (不要忘记连接UITextView's delegate

func textViewDidChange(textView: UITextView) {
    // Change textView height
    self.textView.sizeToFit()

    UIView.setAnimationsEnabled(false)
    self.tableView.beginUpdates()
    self.tableView.endUpdates()
    UIView.setAnimationsEnabled(true)
}

UITableView变为活动状态时,以下方法将UITextView自动滚动到光标。

func textViewDidBeginEditing(textView: UITextView) {
    // Delay the following line so that it works properly
    let delay = 0.005 * Double(NSEC_PER_SEC)
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue()) {
        var rect = self.textView.caretRectForPosition(self.textView.selectedTextRange?.end)
        var changedRect = CGRectMake(rect.origin.x, rect.origin.y, rect.width, rect.height+3)

        self.tableView.scrollRectToVisible(changedRect, animated: true)
    }
}

您还需要更改contentInsetscrollIndicatorInsets方法中的UITableView keyboardWillShowkeyboardWillHide,具体取决于您的屏幕布局。