Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 网间网操作系统。UITextView。UIKeyboardDidHideNotification后的文本跳转_Ios_Iphone_Uitextview - Fatal编程技术网

Ios 网间网操作系统。UITextView。UIKeyboardDidHideNotification后的文本跳转

Ios 网间网操作系统。UITextView。UIKeyboardDidHideNotification后的文本跳转,ios,iphone,uitextview,Ios,Iphone,Uitextview,我有可编辑的UITextView,键盘关闭模式是交互式的。另外,我的控制器正在侦听两个通知:UIKeyboardWillShowNotification,UIKeyboardWillHideNotification func keyboardWillShow(notification: NSNotification) { if let userInfo = notification.userInfo { var insets = self.textView.

我有可编辑的UITextView,键盘关闭模式是交互式的。另外,我的控制器正在侦听两个通知:
UIKeyboardWillShowNotification
UIKeyboardWillHideNotification

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+中的一个bug,还是我做错了什么。 如果这不是一个bug,那么如何在没有跳跃行为的情况下流畅地进行呢


谢谢你的帮助。

我和你有100%完全相同的问题,我也问了一个关于这个问题的问题,但没有人能把它弄对。(是我投票支持你的问题!!)

在经历了4天的挫折之后,我终于找到了解决办法。只需将
UITextView
放在
UITableView
中即可(无需将其放在
UITableView单元格中,只需拖动到
UITableView
即可)。使您的
UITextView
可展开

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

UITextView
激活时,以下方法将使
UITableView
自动滚动到光标

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)
    }
}

您还需要更改
键盘中的UITableView
contentInset
ScrollIndicationSet
显示方法和
键盘隐藏方法,具体取决于您的屏幕布局。

我一直在解决这个完全相同的问题,当我关闭键盘时,UITextView的内容偏移量将跳回
{0,0}
。有趣的是,我只在设备上得到了这种行为,而不是在模拟器上

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

在花了很长时间寻找解决方案后,结果证明非常简单:

textview.layoutManager.allowsNonContiguousLayout = NO;

如中所述。希望有帮助:)

你所说的
contentOffset
跳转到随机位置是什么意思?@Mrunal在隐藏键盘contentOffset后,例如,(0350)。Superview调用layoutSubviews和contentOffset跳转到点(0,-20),然后(通常)跳转到(0,0)尝试覆盖
layoutSubviews
方法,并检查那里的
contentOffset
值。令人惊讶的是,您的解决方案成功了。我不得不添加一些方法来调整textview的大小,至少填充整个屏幕,并重新设置tableViewFooterView以强制重新计算内容大小,但它起了作用,跳转消失了
textview.layoutManager.allowsNonContiguousLayout = NO;