初期設定Windowの作り方

勉強会資料。初期設定Windowの作り方。

../../../_images/PrefWindow.png

プロジェクトファイルは、 PrefWindow.zip に、pdfファイルは、 PrefWindow.pdf に置いておきます。

インスペクタパネルの設計と実装

勉強会資料。インスペクターパネルを複数同時に表示できるようにした。

../../../_images/inspector.png

プロジェクトファイルは、 inspector.zip に置いておきます。

画面分割その1

昔から作ろうとしていて、挫折していた画面分割のUIを作ることにした。

以前は、汎用性を考慮した設計にしようと努力して失敗したので、今回は努力しない方針とする。

まずは、NSScrollerにボタンをつける。

../../../_images/split1.png

垂直スクロールバーの上の方にある。2つのアイコンがそれ。

コードはこんな感じ。

TDScrollView.h

@interface TDScrollView : NSScrollView
@end

TDScrollView.m

#import "TDScrollView.h"

@interface TDScrollView ()

@property (strong) NSButton* vSplitOpenButton;
@property (strong) NSButton* vSplitCloseButton;

@end


@implementation TDScrollView


- (IBAction) responseOpenSplit:(id)sender
{
    id theObject = [NSApp targetForAction:@selector(openSplit:)
                                       to:self
                                     from:self];
    if(theObject && theObject != self)
    {
        [NSApp sendAction:@selector(openSplit:) to:theObject from:self];
    }
}

- (IBAction) responseCloseSplit:(id)sender
{
    id theObject = [NSApp targetForAction:@selector(closeSplit:)
                                       to:self
                                     from:self];
    if(theObject && theObject != self)
    {
        [NSApp sendAction:@selector(closeSplit:) to:theObject from:self];
    }
}

- (void)tile
{
    [super tile];

    if(  self.hasVerticalScroller)
    {
        NSScroller* vScroller        = self.verticalScroller;
        NSRect      vScrollerFrame   = vScroller.frame;

        // 分割ボタン
        if( !self.vSplitOpenButton )
        {
            self.vSplitOpenButton = [[NSButton alloc] initWithFrame: NSZeroRect];
            self.vSplitOpenButton.buttonType = NSMomentaryLightButton;
            self.vSplitOpenButton.bezelStyle = NSThickSquareBezelStyle;
            self.vSplitOpenButton.bordered = NO;
            self.vSplitOpenButton.image = [NSImage imageNamed: @"splitopen"];
            self.vSplitOpenButton.imagePosition = NSImageOnly;
            [self.vSplitOpenButton.cell setImageScaling:NSImageScaleProportionallyDown];

            self.vSplitOpenButton.target = self;
            self.vSplitOpenButton.action = @selector(responseOpenSplit:);

            [self addSubview:self.vSplitOpenButton];
        }

        NSButton*   vOpenButton      = self.vSplitOpenButton;
        NSRect      vOpenButtonFrame;

        // 分割ボタンの位置を設定
        vOpenButtonFrame.origin.x = vScrollerFrame.origin.x;
        vOpenButtonFrame.origin.y = vScrollerFrame.origin.y;
        vOpenButtonFrame.size.height = vScrollerFrame.size.width;
        vOpenButtonFrame.size.width  = vScrollerFrame.size.width;
        vOpenButton.frame = vOpenButtonFrame;

        // スクローラーの表示非表示を同期する
        vOpenButton.hidden = vScroller.hidden;

        // 結合ボタン
        if( !self.vSplitCloseButton )
        {
            self.vSplitCloseButton = [[NSButton alloc] initWithFrame: NSZeroRect];
            self.vSplitCloseButton.buttonType = NSMomentaryLightButton;
            self.vSplitCloseButton.bezelStyle = NSThickSquareBezelStyle;
            self.vSplitCloseButton.bordered = NO;
            self.vSplitCloseButton.image = [NSImage imageNamed: @"splitclose"];
            self.vSplitCloseButton.imagePosition = NSImageOnly;
            [self.vSplitCloseButton.cell setImageScaling:NSImageScaleProportionallyDown];

            self.vSplitCloseButton.target = self;
            self.vSplitCloseButton.action = @selector(responseCloseSplit:);

            [self addSubview:self.vSplitCloseButton];
        }

        NSButton*   vCloseButton      = self.vSplitCloseButton;
        NSRect      vCloseButtonFrame;

        // 結合ボタンの位置を設定
        vCloseButtonFrame.origin.x = vScrollerFrame.origin.x;
        vCloseButtonFrame.origin.y = vScrollerFrame.origin.y + vOpenButtonFrame.size.height;
        vCloseButtonFrame.size.height = vScrollerFrame.size.width;
        vCloseButtonFrame.size.width  = vScrollerFrame.size.width;
        vCloseButton.frame = vCloseButtonFrame;

        // スクローラーの表示非表示を同期する
        vCloseButton.hidden = vScroller.hidden;

        // スクロールバーの大きさをボタンに合わせて調整
        vScrollerFrame.origin.y += vOpenButtonFrame.size.height + vCloseButtonFrame.size.height;
        vScrollerFrame.size.height -= vOpenButtonFrame.size.height + vCloseButtonFrame.size.height;
        [vScroller setFrame:vScrollerFrame];
    }

}

@end

tileメソッドをオーバーライドしないと実装できない。 IBでなんとかしようとしたり、サブクラスしないでなんんとかできると考えてはいけない。

第68回 Cocoa勉強会 関東 - Mac/iOS開発勉強会の告知

Cocoa勉強会 関東( http://cocoa-study.com )の68回目の勉強会です。

見学の方は以下のページで参加表明してください。

http://connpass.com/event/8287/

※勉強会のメンバーの方は こちらに登録してもかまいませんが、 いつものところでも出席登録してください。

日時:20014/9/27(土) 13:00-17:00

集合:現地

会場:千葉県松戸市本町20-10 ルシーナビル7F “FAN CLUB”

JR常磐線/新京成線松戸駅から徒歩2分

http://madcity.jp/fanclub/

参加費:500円(当日集めます)

発表:

Cocoa勉強会 関東について

Mac OS X, iOSでのプログラミングについての勉強会です。 4-6本程度の発表と質疑応答、その他雑談という構成です。 Mac/iOSの比重はその日によって変わります。Macばかりの日もあります。

最近の内容については、 http://wp.cocoa-study.com を参照ください。

勉強会を見学された方で入会を希望される方は、http://www.cocoa-study.com/mail/ から、ご連絡ください。

じゃあね。