如何将光标移动到UITextView中当前行的开头?

时间:2011-11-19 14:35:34

标签: ios iphone cursor uitextview cursor-position

我想为我的UITextView设置一个插入标签按钮,以便用户能够在当前行的开头插入一个标签。 无论光标在哪一行,都应该在行的开头插入标签,然后光标必须到达行的末尾。

有可能吗?

3 个答案:

答案 0 :(得分:2)

UITextView实现了UITextInput协议,该协议有一大堆用于确定文本位置的方法。我不确定这一点,但也许你可以打电话:

  1. selectedTextRange获得插入位置。
  2. positionFromPosition:inDirection:offset:UITextLayoutDirectionLeft一起查找当前行开头的范围。 (我不确定;也许characterRangeByExtendingPosition:inDirection:会更好用吗?)
  3. 使用textRangeFromPosition:toPosition:获取林的开始范围。
  4. 使用replaceRange:withText:插入标签。
  5. 该协议中可能还有其他方法可以让您弄清楚这是否有效。

    编辑:似乎UITextView仅在iOS 5中实现UITextInput。如果你之前有目标,我不确定该建议。

答案 1 :(得分:2)

我对positionFromPosition:inDirection:offset:characterRangeByExtendingPosition:inDirection:没有好运。

但这对我来说很好:

UITextRange *range = [textView selectedTextRange];
CGRect rect = [textView caretRectForPosition:range.start];
UITextPosition *start = [textView closestPositionToPoint:CGPointMake(0, rect.origin.y)];
[textView setSelectedTextRange:[textView textRangeFromPosition:start toPosition:start]];

UPD:上面的代码在iOS7及更早版本上进行了测试。并且不能再使用iOS9了。实际上,我在iOS9设备上运行的文本编辑应用程序中存在一些错误。修好我的应用后,我会更新我的答案。

答案 2 :(得分:0)

我将添加我用来将光标移动到行首(homeTap)的代码,因为它解决了@ zxcat' s中的一些注释回答,关于光标移动到上一个行的开头而不是当前行:

- (void)homeTap:(id)s {
    UITextRange* range = [_textView selectedTextRange];
    CGRect rect = [_textView caretRectForPosition:range.start];
    float halfLineHeight = _textView.font.lineHeight / 2.0;
    UITextPosition* start = [_textView closestPositionToPoint:CGPointMake(0, rect.origin.y + halfLineHeight)];
    [_textView setSelectedTextRange:[_textView textRangeFromPosition:start toPosition:start]];
}

具体来说,我将halfLineHeight添加到rect.origin.y以确保closestPositionToPoint的结果是针对当前行。