我将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];
}
答案 0 :(得分:24)
你正在查看错误的财产。 -state是否检查按钮。你想看看isHighlighted,它会告诉你按钮是否被按下。
看一个复选框:
当您单击并按住它时,复选框仍未选中,但略微变暗(702)。然后当你松开鼠标时,它会检查(704)。然后,当您再次单击并按住时,选中的复选框变暗,但仍然会被选中(705),并且只有当您在内部释放时,它才会取消选中(701)。
因此有两个不同的方面,突出显示和状态,它们结合起来提供4种外观之一。每当单击它时,每个NSButtonCell都会将其状态提升为-nextState返回的状态。但有些按钮类型显示状态,而其他按钮类型不显示。查看任何按钮(例如对话窗口中的" OK"按钮),你会发现它在幕后的状态在打开和关闭之间都会发生变化,即使它总是以相同的方式绘制。
这是您的绘图代码,它查看-showsStateBy属性,并且只显示状态,如果它指示它应该。
答案 1 :(得分:1)
你在init中尝试了[self setButtonType:NSMomentaryLightButton];
吗?