我如何优雅地实现包含链接,纯文本和格式化单词组合的多行文字?现在,我能想到的就是将每个单词分成一个标记并以不同的方式显示/定位它(UILabel,UIButton等),然而,这是非常低效的。以下是我试图通过Instagram中的评论功能实现的一个示例。
注意,格式化的用户名链接,缩进的多行文本以及内联链接标签的可能性。
答案 0 :(得分:3)
编辑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
会覆盖IBOutlet
的普通UIView
[myFTTView setDelegate:self];
[myFTTView addStyles:[self getCoreTextStyle]];
[myFTTView setText:[self parseLinks:text]];
[myFTTView setNeedsDisplay];
解析链接是我单独定义的一种方法,用于搜索主题标签和用户名,然后在找到它们时设置样式(此代码很粗糙,需要改进。我正在考虑切换到{{3}已经有代码搜索hashtags和@usernames。)
-(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;
}
答案 1 :(得分:1)
我能想到的两种方式:
NSAttributedString
s一起使用。难以实现,特别是对于链接(你必须在某处注册一个监听器,计算你“点击”的“链接”,......),但提供最佳性能。UIWebView
并即时编写HTML。性能较差,但更灵活。