0

我正在尝试向我的程序添加语法高亮。
我正在使用此代码添加亮点:

-(void)highlightWord:(NSString *)word: (UIColor *)color {
    int amount = textDisplay.text.length;
    NSString *newString = textDisplay.text;
    NSUInteger count = 0, length = amount;
    NSRange range = NSMakeRange(0, length); 
    while(range.location != NSNotFound)
    {
        range = [textDisplay.text rangeOfString: word options:NSLiteralSearch range:range];
        if(range.location != NSNotFound)
        {
            range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
            count++; 
        }
    }
    while (count != 0) {
        count--;
        NSRange highlight = [newString rangeOfString:word];
        newString = [textDisplay.text stringByReplacingCharactersInRange:highlight withString:@" "];
        UILabel *view1 = [[UILabel alloc] initWithFrame:[self frameOfTextRange:highlight inTextView:textDisplay]];
        view1.text = word;
        view1.textColor = color;
        view1.font = [UIFont fontWithName:@"System" size: 14.0];
        view1.backgroundColor = [UIColor clearColor];
        view1.textAlignment = UITextAlignmentLeft;
        [textDisplay addSubview:view1];
    }

}

- (IBAction)highlighString:(id)sender {

    for (UIView *subview in [textDisplay subviews]){
        if ([subview isKindOfClass:[UILabel class]]){
            [subview removeFromSuperview];
        }
    }

    [self highlightWord:@"test" :[UIColor blueColor]];
    [self highlightWord:@"this" :[UIColor redColor]];
    [self highlightWord:@"is" :[UIColor grayColor]];
    [self highlightWord:@"a" :[UIColor greenColor]];
}
@end

但这似乎会导致奇怪的结果:
...


期望的结果是它无缝地覆盖到彩色标签。

4

1 回答 1

0

混合UILabel并且UITextView不太可能让您轻松复制和粘贴。这是一个有趣的想法,但如果它无缝运行,我会感到惊讶。在所有非 beta 版本的 iOS 中,Apple 对这个问题的通常解决方案是使用UIWebView, 可怕的是。Cocoanetics 有一个名为DTRichTextEditor的工具,我没有评论过,但基于他们在 DTCoreText 上的工作质量(我对此印象非常深刻),我对 iOS 5 寄予厚望。测试版在 NDA 下,但你可以有兴趣观看 WWDC 2012 的第 220 场会议,以获取更多前瞻性信息。

您的特定错误是您将标签作为子视图添加到文本视图中。您应该将它们作为对等点放在文本视图的顶部。将它们放在 textview 中会使您受制于 text view 的绘图系统,这会咬您一口。当然,当您将它们放在文本视图的顶部时,将难以处理复制和粘贴。您需要以某种方式通过触摸,然后正确绘制选择。见上一段。

如果一个完全可编辑的富文本视图很容易用一些标签来破解,那么你会在 GitHub 上找到几个实现。不幸的是,实际上很难做好。我向 Cocoanetics 低头接受它;我很快就放弃了。如果您可以将问题简化为非一般文本视图,那么这种方式可能是可行的,但我建议您进行调查DTRichTextEditor或使用UIWebView. 请参阅 WWDC 2011 的第 511 节“iOS 上 Safari 中的富文本编辑”。

于 2012-07-22T18:13:10.440 回答