我想知道如何在Cocoa/OSX中自定义绘制按钮。因为我的视图是自定义绘制的,所以我不会使用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];
}
@endNSButton的子类:
#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:)];
}发布于 2013-05-31 15:08:15
以下是您的代码中似乎遗漏的内容。
没有调用超级drawRect:dirtyRect
以下是修改后的代码:
@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处,并检查它是否会被调用。
发布于 2013-06-16 04:50:03
您可能会放弃Cell子类,因为看起来您只是使用它来实例化初始化器中的NSButton类型。简单地说
NSButton *button ...
[button setCell: [[TWIButtonCell alloc] init] autorelease]];顺便说一句。在前面的示例中,您可能会有泄漏,因为您先初始化,然后调用可能有自己保留的setCell。
https://stackoverflow.com/questions/16838525
复制相似问题