2011-06-18 9 views
1


NSButtonCellクラスをサブクラス化して、自分のボタンに異なる外観を与えました。私は描画コードが正常に動作しています。これは、CGGradientsで丸められたボタンで、iTunesの再生コントロールのように見えます。彼らは完全に同じではありませんが、私には似ています。NSButtonCellサブクラスのボタンタイプが機能しない

私の問題はボタンタイプです。ボタンタイプを-[PlayerButtonCell initImageCell:]に設定しましたが、ボタンが押されたときにプッシュされただけを描画するようにはなっていません。あなたが見ることができるように、私は[NSButtonCell state]方法で状況に押し込む確認し、

// 
// PlayerButtonCell.m 
// DownTube 
// 

#import "PlayerButtonCell.h" 

@implementation PlayerButtonCell 
/* MARK: Init */ 
- (id)initImageCell:(NSImage *)image { 
    self = [super initImageCell:image]; 
    if(self != nil) { 
     [self setImage:image]; 
     [self setButtonType:NSMomentaryPushInButton]; 
    } 
    return self; 
} 

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView { 
    NSImage *myImage; 
    NSBezierPath *myPath; 
    NSRect myFrame; 
    NSInteger myState; 

    myFrame = NSInsetRect(cellFrame , STROKE_WIDTH/2.0 , STROKE_WIDTH/2.0); 
    myImage = [self image]; 
    myState = [self state]; 

    NSLog(@"%d", [self buttonType]); 

    /* Create bezier path */ 
    { 
     myPath = [NSBezierPath bezierPathWithOvalInRect:myFrame]; 
    } 

    /* Fill with background color */ 
    { 
     /* Fill code here */ 
    } 


    /* Draw gradient if on */ 
    if(myState == NSOffState) { 
     /* Code to draw the button when it's not pushed in */ 

    } else { 
     /* Code to draw the button when it IS pressed */ 
    } 

    /* Stroke */ 
    { 
     /* Code to stroke the bezier path's edge. */ 
    } 
} 
@end 

:私はあなたに私のコードの一部を提示します。ボタンセルは、NSSwitchButtonのように、チェックボックスのように機能します。これは、私が望んでいない。私はそれを瞬間的な光にしたい。

誰かが私を助けることを願って、
IEF2

EDIT: 私はそれをこのコードでボタンを作成し、任意の使用は次のとおりです。

- (NSButton *)makeRefreshButton { 
    NSButton *myButton; 
    NSRect myFrame; 
    NSImage *myIcon; 
    PlayerButtonCell *myCell; 

    myIcon = [NSImage imageNamed:kPlayerViewRefreshIconName]; 
    myCell = [[PlayerButtonCell alloc] initImageCell:myIcon]; 

    myFrame.origin = NSMakePoint(CONTENT_PADDING , CONTENT_PADDING); 
    myFrame.size = CONTROL_PLAYBACK_SIZE; 

    myButton = [[NSButton alloc] initWithFrame:myFrame]; 
    [myButton setCell:myCell]; 
    [myButton setButtonType:NSMomentaryPushInButton]; 

    [myCell release]; 

    return [myButton autorelease]; 
} 

答えて

24

あなたは間違った特性を見ています。 -stateは、ボタンがチェックされているかどうかです。 isHighlightedを見ると、ボタンが押されたかどうかがわかります。チェックボックスで

ルック:

Checkbox states

あなたはクリックして、その上に保持する

は、チェックボックスがまだチェックされていないが、(702)、わずかに暗くなります。次に、マウスを離すと、マウスをチェックします(704)。そして、もう一度クリックすると、チェックボックスが黒くなりますが、まだチェックされています(705)。そして、あなたが中に入ったときだけ、実際にはチェックを外します(701)。

ハイライトとステートの2つの異なるアスペクトがあり、組み合わせて4つの外観を提供します。すべてのNSButtonCellは、クリックされるたびに-nextStateが返すものに状態を進めます。しかし、ボタンの種類によっては状態が表示されるものもあれば、表示されないものもあります。プッシュボタン(たとえば、ダイアログウィンドウの「OK」ボタンなど)を見ると、常に同じ方法で描かれていても、裏側では状態がオンとオフの間で変化することがわかります。

これは、-showsStateByプロパティを調べ、それが必要であることを示す場合にのみ状態を表示するのは、描画コードです。

1

あなたは、initで[self setButtonType:NSMomentaryLightButton];を試してみましたか?

+0

私はそれらのすべてを試しました。 :( – v1Axvw