Iphone UITextView(编辑)-检测到发生了下一行事件

Iphone UITextView(编辑)-检测到发生了下一行事件,iphone,ipad,uitextview,Iphone,Ipad,Uitextview,我有一个可编辑的UITextView。现在我有一个要求,要求我查找(当我继续键入时)下一行何时开始(可能是因为我按了回车键,或者自动换行)。是否有任何通知可以获得,以确定下一行何时开始键入 我尝试在textview中搜索解决方案来查找光标位置,但使用selectedRange和location属性来查找它对我没有帮助。位置值和新行之间根本没有相关性。位置值只是在键入时不断增加。有什么想法吗 谢谢 每当在textView中输入新文本时,将调用以下委托 为UITextView设置委托,然后按如下方式

我有一个可编辑的UITextView。现在我有一个要求,要求我查找(当我继续键入时)下一行何时开始(可能是因为我按了回车键,或者自动换行)。是否有任何通知可以获得,以确定下一行何时开始键入

我尝试在textview中搜索解决方案来查找光标位置,但使用selectedRange和location属性来查找它对我没有帮助。位置值和新行之间根本没有相关性。位置值只是在键入时不断增加。有什么想法吗


谢谢

每当在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
}