繁体   English   中英

如何在可可粉中绘制正方形网格?

[英]How do I draw a grid of squares in Cocoa?

我正在为可可制作视觉上的康威生活游戏程序。 当然,主要视图基本上是一个正方形的网格,随着算法的发展,该网格会在黑色和白色之间改变颜色,但是我很难确定绘制和管理该正方形网格的最佳方法。

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

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

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

我倾向于滥用NSControl子类来绘制图形,并跳过将NSCell与之关联的步骤,但是我想知道是否有更好的方法或我尚未想到的东西。

我在上一个项目中通过使用自定义buttonCells矩阵进行了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;
}

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

“最佳”可能会有所不同,具体取决于您舒适的写作方式以及所呈现矩阵的大小。 当然, NSMatrix将努力在5月份的情况很好,但用它和许多细胞,从而降低了什么人完成的天花板。 对于较大的矩阵或较高的更新频率,您可以考虑避免使用更高级别的抽象。

NSMatrix替代NSMatrix :在这种情况下,矩阵逻辑非常简单。 必要时将其划分或工作也很容易。 一旦实现了该逻辑,您可以:

  • 使用CGContextFillRect (或NSRectFill
  • 或使用位图(例如,使用CGBitmapContext生成图像)

我整理了这个简单的统一网格类。 它基于行,并且根据需要支持每行不同数量的视图。 在每一行中添加相等数量的子视图会生成一个真正的统一网格。

https://github.com/ThesaurusSoftware/TSUniformGrid

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM