在UILabel / UITextView中获取单词

我想要做的是创build一个文本容器组件,它能够指示什么是最接近的单词,当它有一个触摸(即单词“触摸点”后面)。

首先,我创build了一个UILabel子类,并覆盖了touchesEnded:withEvent:方法来确定所触及的CGPoint。 我还写了一个方法,使用sizeWithFont:forWidth:lineBreakMode:来计算文本的每个单词的相应“框架”(CGRect)。 用触摸的CGPoint和这个框架,我可以确定哪个单词实际上被触摸。 但是计算框架的方法只适用于单行文本。

所以现在我需要知道文本的哪一部分在给定的行上(即文本是如何被分割的),以便我能够确定每个单词的正确的左边距和上边距。

任何想法如何我可以得到这个? 或者,也许你有一个更直接的解决scheme来实现这一目标? 这个post不幸的是不是很有帮助… …

(有一个链接到你的链接post中的示例代码项目,其中包含一些有用的示例代码,但我也将在这里概述你的过程。)

简而言之,您将需要使用核心文本,这是苹果先进的基于C的文本处理框架,支持iOS和OS X中所有复杂的文本格式。

完整的代码会有所涉及,但你要看的关键方法是:

CTFramesetterCreateWithAttributedString() – 使用这个和你从标签文本中获得的NSAttributedString结合使用来创buildframesetter

CTFramesetterCreateFrame() – 使用它从上面的框架设置器获取文本的CTFrameRef。 您需要使用标签边界创build一个CGPathRef来执行此操作。

CTFrameGetLines(),CTFrameGetLineOrigins() – 使用这些来分别获得与排版行相对应的CTLineRefs以及行原点的坐标,然后使用CTLineGetStringIndexForPosition()在触摸位置查找字符索引。

然后你可以使用这个字符索引(在该行的参考框架中)向后查找并在你的完整string中find实际的字符/字符/等等。

不要忘记,事情是复杂的几个问题:

  1. 如果您使用UILabel的原生绘图,则必须小心完美地匹配您的排版指标,因为大多数对象(例如,CTFontRef)不能通过与UIKit对应的桥接进行免费桥接。 实现自己的绘图有时可能更容易,这将保证度量的匹配。

  2. 核心文本相对于普通的iOS绘图系统使用倒置的坐标系统。 如果你得到古怪的结果,特别是如果你做自己的绘画,这是需要看看的东西。

不是世界上最简单的任务,而是远远不可能的。 祝你好运!

search了一下之后,我写了一个代码。 代码将适用于UITextViewUILabel
只需下载VSWordDetector.zip,然后解压缩并将文件夹VSWordDetector到您的项目中。
有两个文件VSWordDetector.hVSWordDetector.m
在你的ViewController类中#import VSWordDetector.h

 @property (strong, nonatomic) VSWordDetector *wordDetector; 

注意:使其财产不作为本地。

现在准备好了,只需将它添加到textViewsLabels

 -(void)viewDidLoad { self.wordDetector = [[VSWordDetector alloc] initWithDelegate:self]; [self.wordDetector addOnView:textView]; [self.wordDetector addOnView:label]; } -(void)wordDetector:(VSWordDetector *)wordDetector detectWord:(NSString *)word { NSLog(@"Detected Word: %@", word); } 

当您点击连接的标签或textView时,将调用此委托方法。

编辑: VSWordDetector的 示例代码 。

build议编辑:如果你不想下载示例代码,这里是两个文件的代码。 请看这个要点文件VSWordDetector 。

虽然这是一个古老的问题,但我认为这可能会有所帮助。

由于学习核心文本是巨大的,我select了德国Laullon的GLTapDemo

通过一些更改,这对于在UILabel上检测被触摸的单词非常有用。

Interesting Posts