1

我正在为 Cocoa 开发视觉Conway 的生命游戏程序。当然,主视图基本上是一个正方形网格,随着算法的进行,颜色会在黑色和白色之间变化,但我无法找出绘制和管理这个正方形网格的最佳方法。

我最初的想法是让每个图块成为 NSView 的子类。绘图很简单:如果它还活着,就用黑色填充,如果它死了,就用白色填充。但我不确定如何将它放在窗口中;在 Interface Builder 中将其作为单独的 NSView 进行布局(并为每个 NSView 设置 IB 插座)似乎很乏味。我可以以编程方式定位它们,但这似乎也很乏味(特别是因为我想在每个图块之间留出一点空间)。

我记得 NSMatrix 专门设计用于处理接口对象的数组(或网格),所以我想我可以创建一个 NSView 子类的 NSMatrix。问题是,您似乎只能创建一个 NSControls 的 NSMatrix。我的自定义平铺视图本身并不是真正的控件,因为它不需要接受鼠标跟踪事件等,但我想我可以伪造它并将其仅用于绘图(并且忽略任何事件)。

当然,如果你使用一大堆相同类型的 NSControl,最好使用 NSCell 进行绘图,但 NSCell 似乎更适合绘制基于文本或图像的控件;我没有看到一个简单的方法来绘制一个黑色或白色的矩形。

我倾向于滥用 NSControl 子类来进行绘图,并跳过将 NSCell 与之相关联,但我想知道是否有更好的方法或我还没有想到的东西。

4

4 回答 4

0

“最佳”可能会根据您的写作舒适度以及您呈现的矩阵大小而有所不同。当然,NSMatrix在某些情况下可以正常工作,但是使用它和许多单元会降低一个人可以完成的上限。对于大矩阵或高更新频率,您可能会考虑避免使用更高级别的抽象。

替代方案NSMatrix:在这种情况下,矩阵逻辑非常简单。如有必要,划分它或工作也很容易。实现该逻辑后,您可以:

  • 使用CGContextFillRect(或NSRectFill
  • 或使用位图(例如用CGBitmapContext生成图像)
于 2012-11-10T06:16:14.443 回答
0

我在以前的项目中通过使用自定义矩阵来做到这一点buttonCells。我向backgroundColor按钮单元格添加了一个属性,因此我可以在没有边框的单元格上获得彩色背景(这对于标准单元格类型是不可能的)。这是NSButtonCell我制作的子类:

@interface RDButtonCell : NSButtonCell <NSCoding> 

@property (retain) NSColor *selectedColor;
@property (retain) NSColor *backgroundColor;

-(id)initWithRGBAlpha:(NSArray *)rgbAlpha;


@implementation RDButtonCell

-(id)initWithRGBAlpha:(NSArray *)rgbAlpha {
    if (self = [super init]) {
    NSColor *color = [NSColor colorWithCalibratedRed:[rgbAlpha[0]doubleValue]
                                               green:[rgbAlpha[1]doubleValue] 
                                                blue:[rgbAlpha[2]doubleValue] 
                                               alpha:[rgbAlpha[3]doubleValue]];
    [self setBackgroundColor:color];
    [self setTitle:@""];
    [self setBordered:NO];
    [self setTag:0];
    }
    return self;
}

-(void) setState:(NSInteger)value {
    if (value == 1) {
        self.backgroundColor = self.selectedColor;
        [super setState:value];
    }else {
        self.backgroundColor = self.backgroundColor;
        [super setState:value];
    }
}


-(void) setBackgroundColor:(NSColor *)color {
    _backgroundColor = color;
    _selectedColor = [color colorWithAlphaComponent:.75];
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    [super encodeWithCoder:encoder];
    [encoder encodeObject:_backgroundColor forKey:@"bColor"];
}

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super initWithCoder:decoder];
    _backgroundColor = [decoder decodeObjectForKey:@"bColor"];
    return self;
}
于 2012-11-10T04:51:49.733 回答
0

一种方法是在您的视图中托管一个 CALayer 并为每个单元格创建一个 CALayer(每个单元格层都是视图层的子层)。然后只需设置图层的背景颜色。

于 2012-11-10T05:33:32.253 回答
0

我把这个简单的统一网格类放在一起。它是基于行的,如果需要,每行支持不同数量的视图。向每一行添加相等数量的子视图会生成一个真正的统一网格。

https://github.com/ThesaurusSoftware/TSUniformGrid

于 2014-01-28T14:14:04.087 回答