UILabel在UITextView中没有正确覆盖

时间:2012-07-22 00:06:56

标签: iphone objective-c uilabel uitextview

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

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

但这似乎导致了一些奇怪的结果:
...


理想的结果是它可以无缝地覆盖到彩色标签上。

1 个答案:

答案 0 :(得分:0)

混合UILabelUITextView不太可能让您轻松复制和粘贴。这是一个有趣的想法,但如果它无缝地工作,我会感到惊讶。在所有非beta版本的iOS中,针对此问题的常见Apple解决方案是使用UIWebView,这很糟糕。 Cocoanetics有一个名为DTRichTextEditor但我尚未对其进行评审,但根据他们在DTCoreText(我印象非常深刻)的工作质量,我对iOS 5寄予厚望。 Betas属于NDA,但您可能有兴趣观看WWDC 2012的Session 220,以获取更多未来的信息。

您的具体错误是您将标签作为子视图添加到文本视图中。您应该将它们作为对等项放在文本视图之上。将它们放在文本视图中会使您看到文本视图的绘图系统,它正在咬你。当然,当你把它们放在文本视图的顶部时,这将使得复制和粘贴变得困难。您需要通过某种方式传递触摸,然后正确绘制选择。见上一段。

如果一个完全可编辑的富文本视图很容易被一些标签破解,那么您可以在GitHub上找到几个实现。不幸的是,做起来真的很难。我向Cocoanetics低头接受它;我很快就放弃了。如果您可以将问题简化为非常规文字视图,则可能采用这种方式,但我建议您调查DTRichTextEditorUIWebView。请参阅会议511" iOS上的Safari中的富文本编辑和#34;来自WWDC 2011。