4

我想为我的 UITextView 设置一个插入选项卡按钮,以便用户能够在当前行的开头插入一个选项卡。无论光标在行中的哪个位置,制表符都应该插入到行首,之后光标必须移到行尾。

可能吗 ?

4

3 回答 3

3

positionFromPosition:inDirection:offset:我对and没有运气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 设备上运行的文本编辑应用程序中存在一些错误。修复我的应用程序后,我会更新我的答案。

于 2012-06-13T12:46:26.410 回答
2

UITextView 实现了 UITextInput 协议,它有一大堆确定文本位置的方法。我不确定这一点,但也许您可以致电:

  1. selectedTextRange获得插入符号位置。
  2. positionFromPosition:inDirection:offset:withUITextLayoutDirectionLeft查找到当前行开头的范围。(这我不确定;也许characterRangeByExtendingPosition:inDirection:会更好?)
  3. 用于textRangeFromPosition:toPosition:获取 lin 开始的范围。
  4. 用于replaceRange:withText:插入制表符。

该协议中可能还有其他方法可以让您弄清楚是否不起作用。

编辑:似乎 UITextView 仅从 iOS 5 开始实现 UITextInput。如果您在此之前定位,我不确定该建议什么。

于 2011-11-19T16:50:01.510 回答
0

我将添加我一直用来将光标移动到行homeTap首的代码(当前行:

- (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]];
}

具体来说,我添加halfLineHeightrect.origin.y确保结果来自closestPositionToPoint当前行。

于 2016-02-01T22:12:03.023 回答