我希望为我的UITextView添加一个插入标签按钮,以便用户能够在当前行的开头插入一个标签。无论光标在行中的哪个位置,标签都应该插入在行的开头,之后光标必须移到行的末尾。
是否可能实现?
是否可能实现?
我对 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]];
更新:上述代码已在iOS7及更早版本上测试,但无法在iOS9上运行。实际上,在我的在iOS9设备上运行的文本编辑应用中存在一些错误。修复完我的应用程序后,我会更新答案。UITextPosition *start = [textView closestPositionToPoint:CGPointMake(0, rect.origin.y+rect.size.height)];
- horseshoe7UITextView实现了UITextInput协议,该协议具有一整套用于确定文本位置的方法。我不确定,但也许您可以调用:
selectedTextRange
获取插入符号的位置。positionFromPosition:inDirection:offset:
使用UITextLayoutDirectionLeft
查找到当前行开头的范围。(对此我不太确定;也许characterRangeByExtendingPosition:inDirection:
更好?)textRangeFromPosition:toPosition:
获取行的起始范围。replaceRange:withText:
插入一个制表符。如果这些方法无法解决问题,可能还有其他协议方法可供使用。
编辑:似乎UITextView只在iOS 5及以上版本中实现了UITextInput协议。如果您的目标是之前的版本,我不确定该怎么建议。
我将添加一些代码来移动光标到行首(homeTap
),因为这样可以解决在@zxcat回答中提到的一些问题,即将光标移动到上一行的开头而不是当前行:
- (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
的结果是针对当前行的。