我想为我的 UITextView 设置一个插入选项卡按钮,以便用户能够在当前行的开头插入一个选项卡。无论光标在行中的哪个位置,制表符都应该插入到行首,之后光标必须移到行尾。
可能吗 ?
我想为我的 UITextView 设置一个插入选项卡按钮,以便用户能够在当前行的开头插入一个选项卡。无论光标在行中的哪个位置,制表符都应该插入到行首,之后光标必须移到行尾。
可能吗 ?
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 设备上运行的文本编辑应用程序中存在一些错误。修复我的应用程序后,我会更新我的答案。
UITextView 实现了 UITextInput 协议,它有一大堆确定文本位置的方法。我不确定这一点,但也许您可以致电:
selectedTextRange
获得插入符号位置。positionFromPosition:inDirection:offset:
withUITextLayoutDirectionLeft
查找到当前行开头的范围。(这我不确定;也许characterRangeByExtendingPosition:inDirection:
会更好?)textRangeFromPosition:toPosition:
获取 lin 开始的范围。replaceRange:withText:
插入制表符。该协议中可能还有其他方法可以让您弄清楚是否不起作用。
编辑:似乎 UITextView 仅从 iOS 5 开始实现 UITextInput。如果您在此之前定位,我不确定该建议什么。
我将添加我一直用来将光标移动到行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]];
}
具体来说,我添加halfLineHeight
以rect.origin.y
确保结果来自closestPositionToPoint
当前行。