NSButtonCell子类'按钮类型不起作用

时间:2011-06-18 21:25:11

标签: cocoa drawing subclass nsbuttoncell


我将NSButtonCell类子类化为我的按钮给出了不同的外观。我的绘图代码工作正常。这是一个圆形的按钮,里面装满CGGradients,看起来就像是iTunes播放控件。它们并不完全相同,但它们对我来说足够相似。

现在我的问题是按钮类型。我在-[PlayerButtonCell initImageCell:]中设置了按钮类型,但我没有按下按钮按下时只绘制按下的按钮。我告诉你一段我的代码:

//
//  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

如您所见,我通过[NSButtonCell state]方法检查推入状态。但是按钮单元格就像一个复选框,就像在NSSwitchButton 中一样。这个,我不想要。我希望它能瞬间消失。

希望有人可以帮助我,
ief2

编辑: 我创建了一个按钮,其中包含以下代码:

- (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];
}

2 个答案:

答案 0 :(得分:24)

你正在查看错误的财产。 -state是否检查按钮。你想看看isHighlighted,它会告诉你按钮是否被按下。

看一个复选框:

Checkbox states

当您单击并按住它时,复选框仍未选中,但略微变暗(702)。然后当你松开鼠标时,它会检查(704)。然后,当您再次单击并按住时,选中的复选框变暗,但仍然会被选中(705),并且只有当您在内部释放时,它才会取消选中(701)。

因此有两个不同的方面,突出显示和状态,它们结合起来提供4种外观之一。每当单击它时,每个NSButtonCell都会将其状态提升为-nextState返回的状态。但有些按钮类型显示状态,而其他按钮类型不显示。查看任何按钮(例如对话窗口中的" OK"按钮),你会发现它在幕后的状态在打开和关闭之间都会发生变化,即使它总是以相同的方式绘制。

这是您的绘图代码,它查看-showsStateBy属性,并且只显示状态,如果它指示它应该。

答案 1 :(得分:1)

你在init中尝试了[self setButtonType:NSMomentaryLightButton];吗?