gpt4 book ai didi

macos - 自定义 NSButtonCell,drawBezelWithFrame 未调用

转载 作者:行者123 更新时间:2023-12-03 16:54:39 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何在 Cocoa/OSX 中自定义绘制按钮。由于我的 View 是自定义绘制的,因此我不会使用 IB,而是希望用代码来完成这一切。我创建了 NSButtonCell 的子类和 NSButton 的子类。在 NSButtonCell 的子类中,我重写方法 drawBezelWithFrame:inView: ,在子类 NSButton 的 initWithFrame 方法中,我使用 setCell 在按钮中设置 CustomCell。但是,drawBezelWithFrame 没有被调用,我不明白为什么。有人可以指出我做错了什么或我错过了什么吗?

NSButtonCell 的子类:

#import "TWIButtonCell.h"

@implementation TWIButtonCell

-(void)drawBezelWithFrame:(NSRect)frame inView:(NSView *)controlView
{
//// General Declarations
[[NSGraphicsContext currentContext] saveGraphicsState];

//// Color Declarations
NSColor* fillColor = [NSColor colorWithCalibratedRed: 0 green: 0.59 blue: 0.886 alpha: 1];

//// Rectangle Drawing
NSBezierPath* rectanglePath = [NSBezierPath bezierPathWithRect: NSMakeRect(8.5, 7.5, 85, 25)];
[fillColor setFill];
[rectanglePath fill];
[NSGraphicsContext restoreGraphicsState];
}

@end

NSButton 的子类:

#import "TWIButton.h"
#import "TWIButtonCell.h"

@implementation TWIButton

- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
TWIButtonCell *cell = [[TWIButtonCell alloc]init];
[self setCell:cell];
}

return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
// Drawing code here.
}

@end

用法:

- (void)addSendButton:(NSRect)btnSendRectRect 
{
TWIButton *sendButton = [[TWIButton alloc] initWithFrame:btnSendRectRect];
[self addSubview:sendButton];
[sendButton setTitle:@"Send"];
[sendButton setTarget:self];
[sendButton setAction:@selector(send:)];
}

最佳答案

以下是您的代码中似乎缺少的内容。

  1. 您没有调用 [super drawRect:dirtyRect]
  2. 您没有重写从 NSButton 派生的 Class(TWIButton) 中的 + (Class)cellClass

下面是修改后的代码:

@implementation TWIButton

- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
TWIButtonCell *cell = [[TWIButtonCell alloc]init];
[self setCell:cell];
}

return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
// Drawing code here.
//Changes Added!!!
[super drawRect:dirtyRect];

}

//Changes Added!!!!
+ (Class)cellClass
{
return [TWIButtonCell class];
}

@end

现在将断点保留在drawBezelWithFrame处并检查它是否会被调用。

关于macos - 自定义 NSButtonCell,drawBezelWithFrame 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16838525/

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