Iphone UITextView(编辑)-检测到发生了下一行事件
我有一个可编辑的UITextView。现在我有一个要求,要求我查找(当我继续键入时)下一行何时开始(可能是因为我按了回车键,或者自动换行)。是否有任何通知可以获得,以确定下一行何时开始键入 我尝试在textview中搜索解决方案来查找光标位置,但使用selectedRange和location属性来查找它对我没有帮助。位置值和新行之间根本没有相关性。位置值只是在键入时不断增加。有什么想法吗Iphone UITextView(编辑)-检测到发生了下一行事件,iphone,ipad,uitextview,Iphone,Ipad,Uitextview,我有一个可编辑的UITextView。现在我有一个要求,要求我查找(当我继续键入时)下一行何时开始(可能是因为我按了回车键,或者自动换行)。是否有任何通知可以获得,以确定下一行何时开始键入 我尝试在textview中搜索解决方案来查找光标位置,但使用selectedRange和location属性来查找它对我没有帮助。位置值和新行之间根本没有相关性。位置值只是在键入时不断增加。有什么想法吗 谢谢 每当在textView中输入新文本时,将调用以下委托 为UITextView设置委托,然后按如下方式
谢谢 每当在textView中输入新文本时,将调用以下委托 为UITextView设置委托,然后按如下方式编码
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
{
if ( [text isEqualToString:@"\n"] ) {
//Do whatever you want
}
return YES;
}
将检测从任何内容到点击“return”的行更改、退格以减少行数、键入到行尾并出现换行等(注意:必须调整字体大小的变量,我建议不要使用下面示例中的硬编码数字)
在视图中添加第二个隐藏文本视图。为可见文本视图实现shouldChangeTextInRange,并将隐藏视图上的文本设置为新文本。比较新文本和旧文本的内容大小,以检测换行符。我参加聚会有点晚,但我有一个类似的要求,经过一点调查,我发现“答案与
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
replacementText:(NSString *)text
{
if ([text isEqualToString:@"\n"]) {
textView.text=[NSString stringWithFormat:@"%@\n",textView.text];
// Return FALSE so that the final '\n' character doesn't get added
return NO;
}
// For any other character return TRUE so that the text gets added to the view
return YES;
}
-[id<NSLayoutManagerDelegate> layoutManager:shouldBreakLineByWordBeforeCharacterAtIndex:];
-[id<NSLayoutManagerDelegate> layoutManager:shouldBreakLineByHyphenatingBeforeCharacterAtIndex:];
希望这将证明有用。为了快速使用此
previousRect = CGRectZero
func textViewDidChange(textView: UITextView) {
var pos = textView.endOfDocument
var currentRect = textView.caretRectForPosition(pos)
if(currentRect.origin.y > previousRect?.origin.y){
//new line reached, write your code
}
previousRect = currentRect
}
目标C
CGRect previousRect = CGRectZero;
- (void)textViewDidChange:(UITextView *)textView{
UITextPosition* pos = textView.endOfDocument;
CGRect currentRect = [textView caretRectForPosition:pos];
if (currentRect.origin.y > previousRect.origin.y){
//new line reached, write your code
}
previousRect = currentRect;
}
Sourav Gupta的解决方案部分地为我工作,但是它有一些缺陷,即如果编辑发生在正文正文的中间(例如:写一堆文本,把光标移到中间,然后返回三次),它就不能正确地调用目标代码。以及处理粘贴和文本更正等插入事件。因此,我自己做了一些测试,并发现了更多的条件,在这些条件下,我们可以假设编辑已移动到下一行
注意:这种方法有一些误报,但我发现它更容易接受,因为我使用它来转发代码,因此不必要地布局要比不响应好得多 斯威夫特5我已经使用UITextViewTextDidChangeNotification。如何在文本中查找\n?textView.text不返回到目前为止键入的全部文本吗?自动换行可能发生了,或者我可能遇到了很多空格。在这种情况下,我如何检测下一行的到达?@bourne:是的,它单独检测返回键是的。但是,只有当文本视图为空时,它才会检测到换行符,并且您在其中碰到的第一件事就是返回键。我希望处理多行文本视图换行文字场景,其中换行文字会自动导致换行。我想以某种方式发现这件事。这件事解决了吗?我还需要检测换行符。我解决了这个问题,只是没有检测textview的高度(称为hiddenText)并用新行将其除以高度的变化……非常适合快速移动,但必须在textview上启用滚动。这不起作用。如果你键入一堆文本,然后在文档中间开始编辑,原点就失效了,条件就不再是TuroGo了。你在下面干什么?多年后回到这里,我建议现在使用UITextView的
.font.pointSize
属性,而不仅仅是使用我在示例中给出的硬编码数字。请注意,在键入时,某些复杂的unicode字符可能会导致contentSize在不出现新行的情况下稍微调整高度,因此重要的是,您不能仅监视contentSize.height的更改,但是除以字体大小,这样数学就可以解释实际新行的阈值,而不仅仅是轻微的行高变化。
previousRect = CGRectZero
func textViewDidChange(textView: UITextView) {
var pos = textView.endOfDocument
var currentRect = textView.caretRectForPosition(pos)
if(currentRect.origin.y > previousRect?.origin.y){
//new line reached, write your code
}
previousRect = currentRect
}
CGRect previousRect = CGRectZero;
- (void)textViewDidChange:(UITextView *)textView{
UITextPosition* pos = textView.endOfDocument;
CGRect currentRect = [textView caretRectForPosition:pos];
if (currentRect.origin.y > previousRect.origin.y){
//new line reached, write your code
}
previousRect = currentRect;
}
private var previousRect:CGRect = CGRect.zero
private func checkIfReturnOrLineWrap(textView:UITextView) {
let currentRect = textView.caretRect(for:textView.endOfDocument)
if (currentRect.origin.y != previousRect.origin.y && (previousRect.origin.y != CGFloat.infinity || currentRect.origin.y > 0) ||
currentRect.origin.y == CGFloat.infinity) {
//React to the line change!
}
previousRect = currentRect
}
//MARK: UITextViewDelegate methods (be sure to hook up your textviews!)
func textViewDidChange(_ textView: UITextView) {
checkIfReturnOrLineWrap(textView: textView)
}
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
checkIfReturnOrLineWrap(textView: textView)
return true
}