2012-07-22 19 views
0

我正在尝试向我的程序添加语法高亮显示。
我使用这个代码增添亮点:在UITextView中没有正确覆盖的UILabels

-(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 

但是,这似乎会导致一个奇怪的结果:
...


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

+0

在UITextView上投掷标签(可能具有该字体上的不同字体或属性)始终会很笨重和/或存在风险。为什么不使用[允许属性字符串的UITextView替换](http://stackoverflow.com/a/8961839/981049)? – 2012-07-22 00:25:46

+0

我想除了我*需要*复制和粘贴,但如果一切都失败了,我可以使用这个。 – Sirens 2012-07-22 00:29:39

+0

你这样做的方法太复杂了。让我指导你 - > http://stackoverflow.com/questions/2218415/nstextview-syntax-highlighting使用属性字符串 – 2012-07-22 00:30:47

回答

0

混合UILabelUITextView不太可能让您轻松复制和粘贴。这是一个有趣的想法,但如果它无缝工作,我会感到惊讶。在iOS的所有非测试版本中,针对此问题的常见Apple解决方案是使用UIWebView,因为这是可怕的。 Cocoanetics有一个叫做DTRichTextEditor的文章,我没有回顾,但是基于他们在DTCoreText上的工作质量(我对此印象非常深刻),我对iOS 5寄予了很高的期望。Betas处于NDA之下,但你可能会有兴趣观看来自WWDC 2012的Session 220以获取更多未来信息。

您的具体错误是您将标签添加为文本视图的子视图。你应该把它们放在文本视图的顶部作为同伴。把它们放在textview里面可以让你使用文本视图的绘图系统,这让你很沮丧。当然,当你将它们放在文本视图的顶部时,这会使复制和粘贴难以处理。您需要通过某种方式传递触摸,然后正确地绘制选择。见上一段。

如果一个完全可编辑的富文本视图很容易被一些标签破解,那么你会在GitHub上找到几个实现。不幸的是,做得很好很难。我向Cocoanetics屈服了。我很快就放弃了。如果您可以将问题简化为非常规文本视图,那么可以通过这种方式进行,但我建议您调查DTRichTextEditorUIWebView。请参阅WWDC 2011中的Session 511“iOS中的Safari中的富文本编辑”。