我有可编辑的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+中的错误,还是我做错了什么。 如果它不是一个错误,如何在没有跳跃行为的情况下顺利进行?
感谢您的帮助。
答案 0 :(得分:2)
我一直在与这个完全相同的问题作斗争,当我解雇键盘时,UITextView的内容偏移将跳回{0, 0}
。有趣的是,我只是在设备上有这种行为,而不是在模拟器中。
我最初尝试通过覆盖UITextView的contentOffset
方法并让它忽略{0, 0}
值来解决它,这是半有效的,直到内容太长,在这种情况下它只会跳转到一个随机偏移,并设置相同的值3次(因此它会快速连续地将内容偏移设置为{0, 3605}
,{0, 3605}
和{0, 3605}
。/ p>
经过很长一段时间寻找解决方案后,事实证明这很简单:
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)
}
}
您还需要更改contentInset
和scrollIndicatorInsets
方法中的UITableView keyboardWillShow
和keyboardWillHide
,具体取决于您的屏幕布局。