【问题标题】:How to move cursor to the beginning of the current line in UITextView?如何将光标移动到 UITextView 中当前行的开头?
【发布时间】:2011-11-19 14:35:33
【问题描述】:

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

有可能吗?

【问题讨论】:

  • 当前行还是当前段落?后者很容易,前者不那么容易。

标签: ios iphone uitextview cursor-position text-cursor


【解决方案1】:

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)];
  • @horseshoe7,是的,这可能。上面的代码是为 iOS7(甚至可能是 iOS6)编写的。并且 UITextView 在 iOS8、iOS9 中发生了变化。我稍后会更新答案。需要先检查新行为。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    我将添加我一直用来将光标移动到行首 (​​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 的结果适用于当前行。

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多