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

Posted

技术标签:

【中文标题】为 NSTableView 单元格绘制带有边框和背景的文本【英文标题】:Draw Text with a border and background for a NSTableView cell 【发布时间】:2014-04-23 06:39:12 【问题描述】:

我有一个基于单元格的表格视图,我想在这个表格视图中显示某种标签,最好不必使用基于视图的表格视图。

是否有一种优雅的方式来实现类似于此处示例 (html) 的内容,理想情况下也可以使用背景颜色。

【问题讨论】:

【参考方案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];

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

我还通过提供以下内容调整了表格视图委托中的行高:

- (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row

    return 24.0;

【讨论】:

你能在“绘制时间”知道单元格的大小并调整边框的大小吗? 单元格的边框矩形通过 cellFrame 传入。如果你想测量你的文本,你可以使用 NSAttributedString 的 boundingRectWithSize:options:

以上是关于为 NSTableView 单元格绘制带有边框和背景的文本的主要内容,如果未能解决你的问题,请参考以下文章

带有闪烁边框的表格单元格

iOS:只有一个表格单元格,但屏幕满是单元格边框

Qt QTableView 在活动单元格周围绘制边框

带有多个单元格边框的钱包样式 Swift

如何在 NSScrollView 中控制 NSTableView 的绘制?

如何在表格的某单元格中绘制一条对角线