Age*_*one 5 text cpu-word touch uilabel ios
我想要做的是创建一个文本容器组件,它能够指示当触摸它时最接近的单词(即触摸点"后面"这个词).
首先,我创建了一个UILabel子类并覆盖了touchesEnded:withEvent:方法来确定触摸的CGPoint.我还编写了一个方法,使用sizeWithFont:forWidth:lineBreakMode:计算文本中每个单词的相应"框架"(CGRect).通过触摸的CGPoint和此帧,我可以确定实际触摸的是哪个单词.但是计算帧的方法仅适用于单行文本.
所以现在我需要知道文本的哪一部分在给定的行上(即文本是如何被分割的),这样我就可以计算每个单词的正确左边距和上边距.
知道我怎么能得到这个吗?或者也许有一个更简单的解决方案来实现这一目标?不幸的是,这篇文章不是很有帮助 ......
(链接帖子中有一个示例代码项目的链接,其中包含一些有用的示例代码,但我也将在此概述您的过程.)
简而言之,您将需要使用Core Text,它是Apple的高级基于C的文本处理框架,支持iOS和OS X中所有复杂的文本布局.
完整的代码将涉及一些,但您想要关注的关键方法是:
CTFramesetterCreateWithAttributedString() - 使用它,与您从标签文本中获得的NSAttributedString一起使用,以创建框架设置器
CTFramesetterCreateFrame() - 使用它从上面的框架集中获取文本的CTFrameRef.您需要使用标签边界创建CGPathRef才能执行此操作.
CTFrameGetLines(),CTFrameGetLineOrigins() - 使用它们分别获取与排版行对应的CTLineRefs和行原点的坐标,然后使用CTLineGetStringIndexForPosition()在触摸位置查找字符索引.
然后,您可以使用此字符索引(在行的参考框架中)向后工作,并在完整字符串中查找实际字符/单词/等.
不要忘记,问题很复杂:
如果您使用UILabel的原生绘图,则必须注意与排版指标完美匹配,这可能很麻烦,因为大多数对象(例如CTFontRef)都没有与其UIKit对应物进行免费桥接.有时,实现自己的绘图可能更容易,这将保证度量匹配.
Core Text使用相对于普通iOS绘图系统的倒置坐标系.如果你得到了古怪的结果,特别是如果你自己绘图,这是值得一看的.
这不是世界上最容易的任务,但远非不可能.祝好运!
在搜索了一下后,我为此编写了一个代码.代码适用于UITextView
和UILabel
.
只需下载VSWordDetector.zip然后解压缩并将文件夹拖放VSWordDetector
到项目中.
有两个文件VSWordDetector.h
,并VSWordDetector.m
#import VSWordDetector.h
在你的ViewController
班级.
@property (strong, nonatomic) VSWordDetector *wordDetector;
Run Code Online (Sandbox Code Playgroud)
注意:使其属性不在本地.
现在它已经为你准备好了,只需将它添加到textViews
或Labels
-(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);
}
Run Code Online (Sandbox Code Playgroud)
当您点击连接的标签或textView时,将调用此委托方法.
编辑: 示例代码为VSWordDetector.
建议编辑:如果您不想下载示例代码,请输入两个文件的代码.请参阅此gist文件VSWordDetector.
归档时间: |
|
查看次数: |
7923 次 |
最近记录: |