我将如何优雅地实现包含链接、纯文本和格式化单词组合的多行文本?现在,我所能想到的就是将每个单词分解成一个标记并以不同的方式显示/定位它(UILabel、UIButton 等),但是,这是非常低效的。这是我试图从 Instagram 的评论功能中实现的一个示例。
注意,到用户名的格式化链接、缩进的多行文本以及到主题标签的内联链接的可能性。
编辑 9 月 14 日
所以我能够使用FTCoreTextView实现一些非常相似的东西 。导入/实现很简单。我在我的 ARC 项目中将代码用作静态库。
以下是核心组件:
我使用一种方法来设置我的单元格的样式FTCoreTextView
(NSArray *)getCoreTextStyle{
NSMutableArray *result = [NSMutableArray array];
FTCoreTextStyle *defaultStyle = [FTCoreTextStyle new];
defaultStyle.name = FTCoreTextTagDefault; //though the default name is already set to FTCoreTextTagDefault
defaultStyle.font = [UIFont fontWithName:@"Helvetica Neue" size:14.f];
defaultStyle.textAlignment = FTCoreTextAlignementLeft;
[result addObject:defaultStyle];
FTCoreTextStyle *linkStyle = [defaultStyle copy];
linkStyle.name = FTCoreTextTagLink;
linkStyle.color = [UIColor blueColor];//[del colorWithHexString:@"3aa98"];
linkStyle.font = [UIFont fontWithName:@"Helvetica Neue" size:14.f];
[result addObject:linkStyle];
return result;
}
然后在您的单元格中,您将设置视图的文本、分配委托等。(我的FTCoreTextView
覆盖 a 的纯IBOutlet
文本UIView
)
[myFTTView setDelegate:self];
[myFTTView addStyles:[self getCoreTextStyle]];
[myFTTView setText:[self parseLinks:text]];
[myFTTView setNeedsDisplay];
解析链接是我单独定义的一种方法,用于搜索主题标签和用户名,然后在找到它们时设置样式(此代码很粗糙,还有很多需要改进的地方。我正在考虑切换到已经有代码搜索主题标签和 @的CoreTextHyperlink用户名。)
-(NSString *) parseLinks: (NSString *)cap{
NSArray *split = [cap componentsSeparatedByString:@" "];
NSMutableArray *words = [[NSMutableArray alloc] initWithArray:split];
for (NSString *word in split){
if([word hasPrefix:@"#"] || [word hasPrefix:@"@"]){
NSString *reformat = [NSString stringWithFormat:@"%@%@|%@%@", hashlink,word, word, endhashlink];
[words replaceObjectAtIndex:[split indexOfObject:word] withObject:reformat];
}
}
return [words componentsJoinedByString:@" "];
}
最后但并非最不重要的一点是,单击标签/用户名后调用的方法
- (void)coreTextView:(FTCoreTextView *)acoreTextView receivedTouchOnData:(NSDictionary *)data {
NSString *key = [data objectForKey:@"url"];
if([key hasPrefix:@"#"]){
//do something for tag
}
else{
//do something for user.
}
return;
}
我能想到的两种方法:
NSAttributedString
s 一起使用。很难实现,尤其是对于链接(您必须在某处注册一个侦听器,计算您“单击”的“链接”,...),但提供了最佳性能。UIWebView
并即时编写 HTML。性能较差,但更灵活。