【问题标题】:Cursor position in a UITextViewUITextView 中的光标位置
【发布时间】:2010-09-09 17:54:47
【问题描述】:

我正在寻找一种私人方式来查找 UITextView 中的光标或插入符号(闪烁条)的位置,最好是 CGPoint

可能已经有这样的问题,但它没有提供明确的方法。 和, 我不是指所选区域的NSRange

【问题讨论】:

  • 您能告诉我们您为什么要这样做以获得更多背景信息吗?
  • 用于显示UIMenuController

标签: objective-c cocoa-touch uitextview


【解决方案1】:

刚刚在另一个帖子中得到它:

需要 iOS 3.2 或更高版本。

CGPoint cursorPosition = [textview caretRectForPosition:textview.selectedTextRange.start].origin;

记得在调用这个方法之前检查 selectedTextRange 是否不为零。您还应该使用 selectedTextRange.empty 来检查它是否是光标位置而不是文本范围的开头。所以:

if (textview.selectedTextRange.empty) {
// get cursor position and do stuff ...
}

Pixel-Position of Cursor in UITextView

【讨论】:

  • +1 是的,这是在 <UITextInput> 协议上
  • 这在 iOS 4.3 或更低版本中没有实现,就像阅读文档时会想到的那样。它仅适用于 iOS5+
【解决方案2】:

SWIFT 2.1 版本:

let cursorPosition = infoTextView.caretRectForPosition( (infoTextView.selectedTextRange?.start)! ).origin

print("cursorPosition:\(cursorPosition)")

【讨论】:

    【解决方案3】:

    没有这样的方法。句号。

    关闭您唯一能做的就是使用 CoreText 并行布置文本,从一个点计算文本位置并将其应用到 UITextView。但是,这仅适用于非 0 选择。此外 CoreText 有一个不同的文本布局引擎,例如支持字距调整,而 UITextView 不支持。这可能会导致渲染和布局文本的偏差,从而产生次优结果。

    绝对没有办法定位插入符号。即使您确实使用私有 API,这项任务也非常重要。它只是 iOS 中众多“只是不要”中的一种。

    【讨论】:

    • 所以绝对没有办法计算插入符号的位置?
    • 不。不使用 UITextView。正如我所说:您可以使用 CoreText 再次放置文本并计算那里的位置,但这最多只能为您提供估计。
    【解决方案4】:

    Swift 4 版本:

    // lets be safe, thus if-let
    if let selectedTextRange = textView.selectedTextRange {
        let caretPositionRect = textView.caretRect(for: selectedTextRange.start)
        let caretOrigin = caretPositionRect.origin
        print(">>>>> position rect: \(caretPositionRect), origin: \(caretOrigin)")
    }
    

    我们只需使用textView.selectedTextRange 来获取选定的文本范围,而不是使用textView.caretRect(for:) 来获取CGRect 定义插入符号的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多