Ios 网间网操作系统。UITextView。UIKeyboardDidHideNotification后的文本跳转
我有可编辑的UITextView,键盘关闭模式是交互式的。另外,我的控制器正在侦听两个通知: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.
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)
}
}
您还需要更改键盘中的UITableViewcontentInset
和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;