我想为我的UITextView设置一个插入标签按钮,以便用户能够在当前行的开头插入一个标签。 无论光标在哪一行,都应该在行的开头插入标签,然后光标必须到达行的末尾。
有可能吗?
答案 0 :(得分:2)
UITextView实现了UITextInput协议,该协议有一大堆用于确定文本位置的方法。我不确定这一点,但也许你可以打电话:
selectedTextRange
获得插入位置。positionFromPosition:inDirection:offset:
与UITextLayoutDirectionLeft
一起查找当前行开头的范围。 (我不确定;也许characterRangeByExtendingPosition:inDirection:
会更好用吗?)textRangeFromPosition:toPosition:
获取林的开始范围。replaceRange:withText:
插入标签。该协议中可能还有其他方法可以让您弄清楚这是否有效。
编辑:似乎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
的结果是针对当前行。