我正在尝试为我的程序添加语法高亮。
我正在使用此代码添加亮点:
-(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 :(得分:0)
混合UILabel
和UITextView
不太可能让您轻松复制和粘贴。这是一个有趣的想法,但如果它无缝地工作,我会感到惊讶。在所有非beta版本的iOS中,针对此问题的常见Apple解决方案是使用UIWebView
,这很糟糕。 Cocoanetics有一个名为DTRichTextEditor但我尚未对其进行评审,但根据他们在DTCoreText(我印象非常深刻)的工作质量,我对iOS 5寄予厚望。 Betas属于NDA,但您可能有兴趣观看WWDC 2012的Session 220,以获取更多未来的信息。
您的具体错误是您将标签作为子视图添加到文本视图中。您应该将它们作为对等项放在文本视图之上。将它们放在文本视图中会使您看到文本视图的绘图系统,它正在咬你。当然,当你把它们放在文本视图的顶部时,这将使得复制和粘贴变得困难。您需要通过某种方式传递触摸,然后正确绘制选择。见上一段。
如果一个完全可编辑的富文本视图很容易被一些标签破解,那么您可以在GitHub上找到几个实现。不幸的是,做起来真的很难。我向Cocoanetics低头接受它;我很快就放弃了。如果您可以将问题简化为非常规文字视图,则可能采用这种方式,但我建议您调查DTRichTextEditor
或UIWebView
。请参阅会议511" iOS上的Safari中的富文本编辑和#34;来自WWDC 2011。