1

Cocoa 用の視覚的なConway's Game of Lifeプログラムに取り組んでいます。もちろん、メイン ビューは基本的に、アルゴリズムが進行するにつれて黒と白の間で色が変化する正方形のタイルのグリッドですが、この正方形のグリッドを描画および管理する最良の方法を見つけるのに苦労しています。

私の最初のアイデアは、各タイルを NSView のサブクラスにすることでした。描画は非常に簡単です。生きている場合は黒で塗りつぶし、死んでいる場合は白で塗りつぶすだけです。しかし、それをウィンドウに配置する方法がわかりません。Interface Builder で個別の 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

この単純な均一グリッド クラスをまとめました。これは行ベースであり、必要に応じて行ごとに異なる数のビューをサポートします。各行に同数のサブビューを追加すると、真に均一なグリッドが生成されます。

https://github.com/ThesaurusSoftware/TSUniformGrid

于 2014-01-28T14:14:04.087 に答える
0

1 つの方法は、ビューで CALayer をホストし、すべてのセルに対して CALayer を作成することです (各セル レイヤーはビューのレイヤーのサブレイヤーです)。次に、レイヤーの背景色を設定します。

于 2012-11-10T05:33:32.253 に答える
0

custom のマトリックスを使用して、以前のプロジェクトでこれを行いました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 に答える