为NSTableView单元格绘制带边框和背景的文本

时间:2014-04-23 06:39:13

标签: objective-c macos cocoa nstableview

我有一个基于单元格的tableview,我希望在此tableview中显示某种标记,最好不必使用基于视图的tableview。

是否有一种优雅的方式来实现像这里的示例(HTML),理想情况下也可以使用背景颜色。

Example

1 个答案:

答案 0 :(得分:1)

如果您想坚持使用基于单元格的表格视图,您可以继承NSCell并覆盖:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
{
    NSRect insetRect = NSInsetRect(cellFrame, 2.0, 2.0);
    NSBezierPath* path = [NSBezierPath bezierPathWithRoundedRect:insetRect xRadius:3.0 yRadius:3.0];
    [path stroke];
    [[NSColor whiteColor] setFill];
    [path fill];
    [[NSColor brownColor] setStroke];
    [path stroke];
    NSMutableAttributedString* content = [[NSMutableAttributedString alloc] initWithString:@"DUPLICATE"];
    NSFontManager* fontManager = [NSFontManager sharedFontManager];
    NSFont* font = [fontManager fontWithFamily:@"Verdana"
                                              traits:NSBoldFontMask
                                              weight:0
                                                size:13.0];
    NSDictionary* attributes = @{NSFontAttributeName:font,
                                 NSForegroundColorAttributeName:[NSColor brownColor]};
    [content setAttributes:attributes range:NSMakeRange(0, [content length])];
    [content setAlignment:NSCenterTextAlignment range:NSMakeRange(0, [content length])];
    [content drawInRect:cellFrame];
}

上面的代码会生成一个与您的按钮模糊相似的单元格(您必须自己调整字体,颜色,线条样式等):

enter image description here

我还通过提供:

调整了表视图委托中的行高
- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row
{
    return 24.0;
}