4

我将如何优雅地实现包含链接、纯文本和格式化单词组合的多行文本?现在,我所能想到的就是将每个单词分解成一个标记并以不同的方式显示/定位它(UILabel、UIButton 等),但是,这是非常低效的。这是我试图从 Instagram 的评论功能中实现的一个示例。

Instagram 评论

注意,到用户名的格式化链接、缩进的多行文本以及到主题标签的内联链接的可能性。

4

2 回答 2

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覆盖 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;
    
       }
    
于 2012-09-21T17:59:12.183 回答
1

我能想到的两种方法:

  • 将 CoreText 与NSAttributedStrings 一起使用。很难实现,尤其是对于链接(您必须在某处注册一个侦听器,计算您“单击”的“链接”,...),但提供了最佳性能。
  • 使用 aUIWebView并即时编写 HTML。性能较差,但更灵活。
于 2012-09-09T12:38:19.610 回答