1

基礎となるアルゴリズムの実行中に異なる色を想定する 2 セットの正方形 (チェスのようなグリッド) で構成される Cocoa UI を作成しようとしています。アルゴリズムの実行が終了すると、UI はクリック、パン、その他のジェスチャを処理できる必要があります。

これまでの階層は次のとおりです (詳細については、添付のコードを確認してください)。

1) ウィンドウコントローラのウィンドウであるメインウィンドウ

2) mainView と sideView の 2 つのカスタム ビューを含む分割ビュー (それぞれが正方形のセットを保持します)

3) 2 つのビュー コントローラー (mainViewController と sideViewController)

mainView と sideView のサブビューとして正方形を読み込めるようにしたいと思います。

私は別のカスタム ビューを考えました。たとえば、SquareView と別の nib ファイルを使用します。私の質問は次のとおりです。

a) チェスのようなグリッドを形成するサブビューとして mainView および sideView に追加される正方形を作成するために使用できるように、この SquareView を作成するにはどうすればよいですか?

b) サブビューを mainView と sideView に追加して 2 つのグリッドを構築するにはどうすればよいですか? 簡単にするために、前述の各ビューに 4 つの重複しない正方形があると仮定しましょう。

ありがとうございました!


MainView.m

#import "MainView.h"


@implementation MainView

- (void)drawRect:(NSRect)TheRect 
{
    [[NSColor grayColor] set];
    [NSBezierPath fillRect:[self bounds]];
}

SideView.m

#import "SideView.h"


@implementation MainView

- (void)drawRect:(NSRect)TheRect 
{
    [[NSColor whiteColor] set];
    [NSBezierPath fillRect:[self bounds]];
}

MainWindowController.h

#import <Cocoa/Cocoa.h>

@class SideViewController;
@class MainViewController;

@interface MainWindowController : NSWindowController 
{
    IBOutlet NSSplitView* oMainSplitView;
    SideViewController* sideViewController;
    MainViewController* mainViewController;

}

@end

MainWindowController.m

#import "MainWindowController.h"
#import "SideViewController.h"
#import "MainViewController.h"

@implementation MainWindowController

- (void)windowDidLoad
{

   sideViewController = [[SideViewController alloc] initWithNibName:@"SideView" bundle:nil];
   NSView* splitViewLeftView = [[oMainSplitView subviews] objectAtIndex:0];
   NSView* sideView = [sideViewController view];
   [sideView setFrame:[splitViewLeftView bounds]];
   [sideView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
   [splitViewLeftView addSubview:sideView];

   mainViewController = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil];
   NSView* splitViewRightView = [[oMainSplitView subviews] objectAtIndex:1];
   NSView* mainView = [mainViewController view];
   [mainView setFrame:[splitViewRightView bounds]];
   [mainView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
   [splitViewRightView addSubview:mainView];
}    
4

2 に答える 2

0

これは、必要に応じて単純にすることも複雑にすることもできます。MainView の drawRect メソッドで必要なことをすべて行います。複雑: NSView (または NSCell や NSBox など) を入れ子にして、それぞれに自分自身を描画させます。

個人的には、シンプルにすることに投票したいと思います…</p>

于 2012-05-02T23:25:00.557 に答える
0

a) コードまたは IB で実行できる NSBoxes のマトリックスを作成するのが最も簡単な方法だと思います。正方形をマトリックスにすると、それらをループしたり、特定のものにアクセスしたりしやすくなります。

b)あなたの質問がここにあるのかわかりません-[mainView addSubview:squareMatrix]を使用して、投稿されたコードで行ったのと同じようにします。

編集後: 実際、IB では NSBoxes をマトリックスに埋め込むことはできないようです。過去に、クリック可能でクリックすると色が変わる 64x64 セルのグリッドを持つ、サブクラス化された NSButtonCells (境界線なしの背景色を許可するため) のマトリックスを作成しました。ビューに固定数のセルが必要なのか、それとも数を動的に変更する必要があるのか​​ わかりません。このようなものがうまくいくと思います.IBは多くのセルで更新するのが本当に遅かったので、実際にこれをコードで作成しました。

これが私がしたことです。私の場合、境界線はなく背景色のあるセルが必要だったので、次のように NSButtonCell をサブクラス化する必要がありました。

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

-(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:self.backgroundColor forKey:@"bColor"]; 
}

- (id)initWithCoder:(NSCoder *)decoder {
    [super initWithCoder:decoder];
    self.backgroundColor = [decoder decodeObjectForKey:@"bColor"];
    return self;
}

次のように、コードでマトリックスを作成しました。

@implementation RDMatrix

-(void) initWithParentView:(NSView *) cv {
    NSNumber *one = [NSNumber numberWithInt:1];
    NSArray *colors = [NSArray arrayWithObjects:one,one,one,one,nil];
    RDButtonCell *theCell = [[RDButtonCell alloc ]initWithRGBAlpha:colors];
    [self initWithFrame:NSMakeRect(200,100,1,1) mode:2 prototype:theCell numberOfRows:64 numberOfColumns:64]; 
    [self setSelectionByRect:TRUE];
    [self setCellSize:NSMakeSize(8,8)];
    [self sizeToCells];
    self.target = self;
    self.action = @selector(matrixClick:);
    self.backgroundColor = [NSColor lightGrayColor];
    self.drawsBackground = TRUE;
    self.autoresizingMask = 8;
    self.allowsEmptySelection = TRUE;
    [cv addSubview:self]; 
}

-(void) matrixClick: (id) sender {
    for  (RDButtonCell *aCell in self.selectedCells){
        if ([self.selectedCells count] < 64) {
             aCell.backgroundColor = [NSColor colorWithCalibratedRed:1 green:0 blue:0 alpha:1];
        }else{
        aCell.backgroundColor = [NSColor colorWithCalibratedRed:0 green:.5 blue:1 alpha:1];
        }
    }
    [self deselectAllCells];
}
@end
于 2012-05-02T02:00:18.783 に答える