【发布时间】:2011-11-19 14:35:33
【问题描述】:
我希望我的 UITextView 有一个插入选项卡按钮,以便用户能够在当前行的开头插入一个选项卡。 无论光标在行中的哪个位置,制表符都应该插入到行首,然后光标必须到行尾。
有可能吗?
【问题讨论】:
-
当前行还是当前段落?后者很容易,前者不那么容易。
标签: ios iphone uitextview cursor-position text-cursor
我希望我的 UITextView 有一个插入选项卡按钮,以便用户能够在当前行的开头插入一个选项卡。 无论光标在行中的哪个位置,制表符都应该插入到行首,然后光标必须到行尾。
有可能吗?
【问题讨论】:
标签: ios iphone uitextview cursor-position text-cursor
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 设备上运行的文本编辑应用程序中存在一些错误。我会在修复我的应用后更新我的答案。
【讨论】:
UITextPosition *start = [textView closestPositionToPoint:CGPointMake(0, rect.origin.y+rect.size.height)];
UITextView 实现了 UITextInput 协议,它有一大堆确定文本位置的方法。我不确定,但也许您可以致电:
selectedTextRange 获取插入符号位置。positionFromPosition:inDirection:offset: 和 UITextLayoutDirectionLeft 查找到当前行开头的范围。 (这个我不确定;也许characterRangeByExtendingPosition:inDirection: 会更好?)textRangeFromPosition:toPosition: 获取 lin 开头的范围。replaceRange:withText: 插入标签。该协议中可能还有其他方法可以让您弄清楚是否不起作用。
编辑:似乎 UITextView 仅从 iOS 5 开始实现 UITextInput。如果您在此之前定位,我不确定该建议什么。
【讨论】:
我将添加我一直用来将光标移动到行首 (homeTap) 的代码,因为它解决了 @zxcat 的答案中的一些 cmets,关于光标移动到开头上一个行而不是当前行:
- (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 的结果适用于当前行。
【讨论】: