【问题标题】:Find CGPoint Location of substring in TextView在 TextView 中查找子字符串的 CGPoint 位置
【发布时间】:2015-04-12 15:22:42
【问题描述】:

我正在寻找创建一个位于 UITextView 内子字符串位置的 SpriteKit 节点。我将如何检索 CGPoint 位置以便我可以将 SKNode 定位在那里?

    let textFont = [NSFontAttributeName: UIFont(name: "GillSansMT", size: 30.0) ?? UIFont.systemFontOfSize(18.0)]
    attrString1 = NSMutableAttributedString(string: "My name is Dug.", attributes: textFont)
    textShown1 = CustomTextView(frame: CGRectMake(CGRectGetMidX(self.frame), 175 + (90 * paragraphNumber), CGRectGetWidth(self.frame) - 80, CGRectGetHeight(self.frame)-400))
    textShown1.attributedText = attrString1

    self.view?.addSubview(textShown1)

【问题讨论】:

  • 我在您的问题中看不到任何“子字符串”。你想做什么?
  • 对不起,我举了一个例子。我希望能够找到属性字符串“name”中的“n”在 textView 内的坐标位置。原因是,我想在那个位置创建一个 SKEmitter 粒子节点。
  • CustomTextView 是什么?它是UITextView 的子类吗?如果有,是否会修改UITextView 绘制文本的方式?
  • 因此,您可以使用 Text Kit 轻松完成此操作。它会告诉您所有文本的位置。
  • 这并不完全是您正在尝试做的示例,但它说明了如何在文本视图中处理文本的几何图形:github.com/mattneub/Programming-iOS-Book-Examples/blob/master/…

标签: ios swift sprite-kit uitextview nsattributedstring


【解决方案1】:

你可以在UITextView上使用firstRectForRange(_:)方法

let textFont = [NSFontAttributeName: UIFont(name: "GillSansMT", size: 30.0) ?? UIFont.systemFontOfSize(18.0)]
let attrString1 = NSMutableAttributedString(string: "My name is Dug.", attributes: textFont)

// range of substring to search
let str1 = attrString1.string as NSString
let range = str1.rangeOfString("name", options: nil, range: NSMakeRange(0, str1.length))

// prepare the textview
let textView = UITextView(frame:CGRectMake(0,0,200,200))
textView.attributedText = attrString1

// you should ensure layout
textView.layoutManager.ensureLayoutForTextContainer(textView.textContainer)

// text position of the range.location
let start = textView.positionFromPosition(textView.beginningOfDocument, offset: range.location)!
// text position of the end of the range    
let end = textView.positionFromPosition(start, offset: range.length)!

// text range of the range
let tRange = textView.textRangeFromPosition(start, toPosition: end)

// here it is!
let rect = textView.firstRectForRange(tRange)

【讨论】:

  • 谢谢。像魅力一样工作。请问我为什么需要确保布局?
  • 当您修改UITextView 的任何属性时,它没有有效的文本布局直到下一个绘制循环ensureLayoutForTextContainer() 可以强制这样做。
  • 再次感谢,如果我可以再问一个 q - 我正在尝试在全局视图中找到 rect 的位置。我正在将包含 UITextView 的 rect 的 frame.minY 和 minX 添加到字符串 rect 的 x 和 y 值中。 x 有效,y 很差。有什么想法吗?
  • 哎呀,忘了说。 @rintaro
  • 我认为这是因为 UIKit 和 SpriteKit 之间的坐标系不匹配。也许这个答案可能对您有所帮助:stackoverflow.com/a/27158803/3804019
猜你喜欢
  • 2012-05-21
  • 2012-08-03
  • 2017-03-27
  • 2015-09-13
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多