编程多行混合uiview类型文本

时间:2012-04-23 19:45:24

标签: ios uiview uibutton comments uilabel

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

Instagram comments

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

2 个答案:

答案 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)

我能想到的两种方式:

  • 将CoreText与NSAttributedString s一起使用。难以实现,特别是对于链接(你必须在某处注册一个监听器,计算你“点击”的“链接”,......),但提供最佳性能。
  • 使用UIWebView并即时编写HTML。性能较差,但更灵活。