【问题标题】:How do I change the color or a NSTableCellView for each cell of an NSOutlineView如何更改 NSOutlineView 的每个单元格的颜色或 NSTableCellView
【发布时间】:2013-08-09 10:35:02
【问题描述】:

我查看了许多问题,但找不到好的解决方案用于基于视图的 NSOutlineView

Coloring NSTableView Text per row

Change color of NSTableViewCell

Custom background colors for NSTableCellView

我正在尝试将每一行设置为我想要的任何颜色。我在某处读到需要将NSTableRowView 子类化,我现在已经完成了。

根据AppleDocs,我看到以下方法:

– drawBackgroundInRect:
– drawDraggingDestinationFeedbackInRect:
– drawSelectionInRect:
– drawSeparatorInRect:

如何设置各个行的背景颜色?我是不是走错路了?

编辑:下方(也已编辑标题)

由于我使用的是 NSOutlineView 而不是 NSTableView,所以当我更改单元格的背景颜色时,图像如下所示。左侧的披露箭头未着色。有什么办法可以改变 NSOutlineView 整行的颜色吗?

【问题讨论】:

  • 您需要为行视图设置绘图样式。

标签: objective-c cocoa


【解决方案1】:

你可以继承 NSTableViewCell,并添加一个方法来设置它的颜色。

NSTableViewCell 已经是 NSView 的子类,所以在你的子类中,你需要添加以下方法:

- (void)setBackgroundColor {
    self.layer.backgroundColor = CGColorCreateGenericRGB(0, 0, 0, 1.0f); // or whatever color
}

或者类似的东西。您可能希望将颜色作为该方法的参数。然后,在您的表视图委托中,您可以根据传递给委托方法的行索引设置颜色。例如:

- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];

    if (indexPath.row % 2) {
        [cell setBackgroundColor:[UIColor redColor]]; // or something like that
    }
}

【讨论】:

  • 把这个方法加到init方法中是什么意思?
  • 对不起,不是init方法,只是子类。
  • 另外,添加了使用这个的表格视图示例。
  • 编辑了上面的问题
【解决方案2】:

这确实应该依赖于数据模型中的属性或 ivars。 如果您使用基于视图的大纲视图,您可以简单地为您的行视图和/或单元格视图提供自定义视图。 让自定义视图根据您表示的对象中的数据绘制您想要的任何内容。

【讨论】:

  • 我已经有自定义视图。这就是我卡住的地方。我如何使用我的自定义视图来绘制它?如果我有示例代码来绘制一种颜色,我会知道如何做剩下的。
  • 因此,如果您的代表对象有某种方法来识别正确的样式,最好是一个用于编码简单的属性,您的视图单元可以向代表对象询问属性 XYZ。如果是 X,做 XStyling。如果 IB 不允许,您可以在代码中进行绑定。样式部分与任何条件逻辑相同,但可能侧重于确定在 drawRect 中要做什么。只需在视图类中添加您需要的属性。说一个 NSInteger 标志来设置和使用来确定如何绘制。
  • 我不认为你明白我在问什么。我知道这一切。我有条件逻辑(XYZ)来做逻辑..我已经设置好了所有东西。但我的问题是 --> 我怎么画?什么是抽奖码?这就是我一直在问的问题..我不知道绘图代码..
  • 啊哈。那就这样吧。你到底想画什么?在用于包含视图的背景的 drawRect 中,它非常简单但不容易猜到。我可以给你一些指示。
  • 我只想画一个蓝色的背景。一旦我看到蓝色的代码,我可以更改为其他颜色。我只希望单元格有蓝色背景。但与上面显示的方式不同,我希望将整个单元格设为蓝色,而不是仅显示其中的一部分。我在drawRect中放了什么代码?
【解决方案3】:

想出了一个解决方案。实现了以下。

-(void)outlineView:(NSOutlineView *)outlineView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row {
    [self updateRowViewBackColorforItem:[outlineView itemAtRow:row]];
}

-(void)updateRowViewBackColorforStep:(myCustomItem *)customItem {
    static NSColor *color1;
    static NSColor *color2;
    static NSColor *color3;

    if (color1 == nil) {
        sharedcolorHeader = [NSColor colorWithCalibratedRed:(r/255.0f) green:(g/255.0f) blue:(b/255.0f) alpha:1.0];
    }
    if (color2 == nil) {
        sharedcolorChildren = [NSColor colorWithCalibratedRed:(x/255.0f) green:(y/255.0f) blue:(z/255.0f) alpha:1.0];
    }
    if (color3 == nil) {
        normalColor = [NSColor colorWithCalibratedRed:(255/255.0f) green:(255/255.0f) blue:(255/255.0f) alpha:1.0];
    }

    NSInteger row = [stepOutlineView rowForItem:step];
    if (row < 0) return;

    NSTableRowView *view = [myOutlineView rowViewAtRow:row makeIfNecessary:NO];

   if ([customItem type] == 1) {
        [view setBackgroundColor:sharedcolorHeader];
    } else if([customItem type] == 2) {
        [view setBackgroundColor:sharedcolorChildren];
    } else {
        [view setBackgroundColor:normalColor];
    }
}

【讨论】:

  • 这是什么:(x/255.0f)?定义浮点数的捷径?
  • 我不知道为什么会这样,但就是这样。通过快速谷歌搜索,我可以找出原因,但我没有时间。颜色值 x 必须除以 255 才能以您期望的颜色显示。
  • 啊,我明白了:颜色值在 0..1 之间浮动,所以 1 表示“全彩”,0 表示没有颜色。几年前,我在简单的 8 位 VGA 屏幕上进行编码,所以 255 是完整的 8 位,因此您必须将 8 位值映射到 0..1 的范围内。这几天看到这个很困惑。
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2015-12-21
  • 1970-01-01
  • 2020-04-28
  • 2014-08-24
相关资源
最近更新 更多