gpt4 book ai didi

cocoa - NSButtonCell 子类的按钮类型不起作用

转载 作者:行者123 更新时间:2023-12-03 16:48:46 27 4
gpt4 key购买 nike


我对 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];
}

最佳答案

您看错了属性。 -state 是按钮是否被选中。您想要查看 isHighlighted,它告诉您按钮是否被按下。

查看复选框:

Checkbox states

当您单击并按住它时,该复选框仍处于未选中状态,但会稍微变暗 (702)。然后当您释放鼠标时,它会进行检查(704)。然后,当您再次单击并按住时,选中的复选框会变暗,但仍然处于选中状态(705),并且只有当您在内部释放时,它实际上会取消选中(701)。

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

您的绘图代码会查看 -showsStateBy 属性,并且仅在表明应该显示状态时才显示状态。

关于cocoa - NSButtonCell 子类的按钮类型不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6398989/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com