您的位置:首页 > Web前端 > CSS

【Mac OS X开发】NSTextFieldCell选中和正常状态的字体段落样式设置

2013-09-01 08:05 716 查看
在设置NSTextFieldCell在选中状态和未选中状态时的两种不同的字体段落样式时,即更改字体颜色与字体类型、大小和段落的首行缩进、行未显示完全的分割样式等,查找网上的资料,发现有很多是复制attributedStringValue进行属性字典的构建,先前也觉得这样很便利,可以直接针对某属性样式进行修改,如下所示:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
{
if([self isHighlighted]) { // 该单元格处于选中状态时
color = [NSColor cyanColor];
[color set];
NSRectFill(cellFrame);

NSDictionary *attribs = [[[[self attributedStringValue] attributesAtIndex:0 effectiveRange:nil] mutableCopy] autorelease];
[attribs setValue:[NSColor blueColor] forKey:NSForegroundColorAttributeName];
NSMutableParagraphStyle *paraStyle = [attribs objectForKey:NSParagraphStyleAttributeName];
[paraStyle setFirstLineHeadIndent:12.0];
[paraStyle setLineBreakMode:NSLineBreakByTruncatingTail];
[[self title] drawInRect:cellFrame withAttributes:attribs];

}
else { // 该单元格处于未选中状态时
NSDictionary *attribs = [[[[self attributedStringValue] attributesAtIndex:0 effectiveRange:nil] mutableCopy] autorelease];
[attribs setValue:[NSColor whiteColor] forKey:NSForegroundColorAttributeName];
NSMutableParagraphStyle *paraStyle = [attribs objectForKey:NSParagraphStyleAttributeName];
[paraStyle setFirstLineHeadIndent:12.0];
[paraStyle setLineBreakMode:NSLineBreakByTruncatingTail];
[[self title] drawInRect:cellFrame withAttributes:attribs];
}
}


但是,这样直接使用NSTextFieldCell的attributedStringValue进行拷贝初始化属性字段,有时候运行程序的时候会出现提示为“Thread 1: EXC_BAD_ACCESS (code=1, address=0x10)”的bug,经过Profile的Zombie测试后才发现问题出现在这里。

后来试着修改成如下所示,顺利通过测试!即先构造一个空的NSDictionary,再向里面添加自定义的键值,NSMutableParagraphStyle初始化时使用defaultParagraphStyle进行拷贝而来。

现将运行顺利的代码附上:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
{
if([self isHighlighted]) { // 该单元格处于选中状态时
color = [NSColor cyanColor];
[color set];
NSRectFill(cellFrame);

NSDictionary *attribs = [[[NSMutableDictionary alloc] init] autorelease];
[attribs setValue:[NSColor blueColor] forKey:NSForegroundColorAttributeName];
NSMutableParagraphStyle *paraStyle = [[[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy] autorelease];
[paraStyle setFirstLineHeadIndent:12.0];
[paraStyle setLineBreakMode:NSLineBreakByTruncatingTail];
[attribs setValue:paraStyle forKey:NSParagraphStyleAttributeName];
NSFont *font = [NSFont fontWithName:@"Helvetica" size:14];
[attribs setValue:font forKey:NSFontAttributeName];
[[self title] drawInRect:cellFrame withAttributes:attribs];

}
else { // 该单元格处于未选中状态时
NSDictionary *attribs = [[[NSMutableDictionary alloc] init] autorelease];
[attribs setValue:[NSColor whiteColor] forKey:NSForegroundColorAttributeName];
NSMutableParagraphStyle *paraStyle = [[[NSMutableParagraphStyle defaultParagraphStyle] mutableCopy] autorelease];
[paraStyle setFirstLineHeadIndent:12.0];
[paraStyle setLineBreakMode:NSLineBreakByTruncatingTail];
[attribs setValue:paraStyle forKey:NSParagraphStyleAttributeName];
NSFont *font = [NSFont fontWithName:@"Helvetica" size:14];
[attribs setValue:font forKey:NSFontAttributeName];
[[self title] drawInRect:cellFrame withAttributes:attribs];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: