2012-04-01 3 views
1

NSWindowのサブクラスを使用して、自分のアプリケーション用のウィンドウをカスタマイズしています。 私はすべての設定をしましたが、コーナーを丸くする方法がわかりません。 現在のところ、私のウィンドウは透明な長方形のウィンドウで、いくつかのボタン、ラベル、テキストフィールドがあります。目的C、丸められた角のカスタムウィンドウ?

クラスが含まれています:

#import "TransparentRoundRectWindow.h" 

@implementation TransparentRoundRectWindow 

-(id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag 
{ 
    self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; 
    if (self) { 
     [self setAlphaValue:0.75]; 
     [self setOpaque:YES]; 
     [self setHasShadow:YES]; 
     [self setBackgroundColor:[NSColor clearColor]]; 
    } 
    return self; 
} 

-(BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 

は、私はちょうど今、ラウンドコーナーを作成する必要があります。私は同様の状況を探してみましたが、そのうちのいくつかがdrawRectメソッドをオーバーライドするよう説明していましたが、それらを動作させることができませんでした。 どうすればこのことができますか? (私はMac OS X Lionを使用しています)

ありがとうございます。

答えて

6

あなたのウィンドウを[不透明]に設定する必要があります。ウィンドウのビューをサブクラス化します。

ウィンドウのサブクラス:

-(id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag 
{ 
    self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; 
    if (self) { 

     [self setOpaque:NO]; 
     [self setHasShadow:YES]; 
     [self setBackgroundColor:[NSColor clearColor]]; 
    } 
    return self; 
} 

-(BOOL)canBecomeKeyWindow 
{ 
    return YES; 
} 

ウィンドウのビューのサブクラス:

- (void)drawRect:(NSRect)rect 
{ 
    NSBezierPath * path; 
    path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:8 yRadius:8]; 

    [[NSColor colorWithCalibratedRed:0 green:0 blue:0 alpha:0.75] set]; 
    [path fill]; 
} 

結果:

result

これを行う方法を詳細に説明:

新しいNSViewのクラスを作成し、私はそれに書いた「ウィンドウのビューサブクラス」コードを貼り付けます。その後、あなたのウィンドウのビューに移動します。

はここで上のウィンドウのビューをクリックです:あなたの作成したクラスへのアイデンティティインスペクタと設定クラスに

Window's view

ゴー:答えを

enter image description here

+0

感謝。それらは2つのクラスに分かれていますか?私はそれらをすべて同じクラスに入れました。私はObjective-cの新機能ですので、ウィンドウのビューサブクラスを追加する方法について簡単に説明できればもっと助かります。また、setOpaqueをNOに変更すると、完全に透明なウィンドウが表示されますが、部分的に透明にしたい(アルファベットが0.75)だけです。私は何か間違っているのですか? – Dennis

+0

@Dennisこれを行う方法の説明を追加しました。 –

+0

はい、それはついに実現しました!!どうもありがとうございます。ただし、ウィンドウ内のすべてのオブジェクトには、その白い角があります。テキストフィールド、ボタン、ラベルに余分な四角形があります。とにかくそれらを取り除くことはありますか?これらのオブジェクトのそれぞれにサブクラスを作成する必要がありますか? – Dennis

関連する問題