5

我需要创建一个带有图像和标题的 NSButton,但我不喜欢 cocoa 中的任何标准定位方法。

我决定子类化按钮单元并覆盖-imageRectForBounds:and-titleRectForBounds:来提供我的自定义位置。问题是该-titleRectForBounds:方法被正常调用,但-imageRectForBounds:不是。

按钮中的图像正常显示,因此单元格必须有一个框架来绘制我只是不知道它从哪里得到的图像。

代码真的很简单。目前我唯一做的就是继承 NSButtonCell 并覆盖这两个方法。然后在 IB 中,我选择一个 NSButton 并将其单元格类更改为我的自定义按钮单元格。

这是代码:

#import "JSButtonCell.h"

@implementation JSButtonCell

- (NSRect)titleRectForBounds:(NSRect)theRect
{
    NSLog(@"Bounds for title");
    NSLog(@"%@",NSStringFromRect(theRect));
    NSRect titleRect = [super titleRectForBounds:theRect];
    NSLog(@"Title rect");
    NSLog(@"%@",NSStringFromRect(titleRect));
    return titleRect;
}

- (NSRect)imageRectForBounds:(NSRect)theRect
{
    NSLog(@"Bounds for image");
    NSLog(@"%@",NSStringFromRect(theRect));
    NSRect imageRect = [super imageRectForBounds:theRect];
    NSLog(@"Image rect");
    NSLog(@"%@",NSStringFromRect(imageRect));
    imageRect.origin.y -= 20;
    return imageRect;
}

@end
4

1 回答 1

2

据我所知,几乎没有调试,默认NSButtonCell实现不会调用drawImage:withFrame:inView:. 为什么?我在论坛和 Apple 文档中都找不到答案(如果有人解释 - 我会很高兴 :)。我通过简单地覆盖drawImage:withFrame:inView:和调用来解决这个问题imageRectForBounds:

- (void)drawImage:(NSImage *)image withFrame:(NSRect)frame inView:(NSView *)controlView
{
    [super drawImage:image withFrame:[self imageRectForBounds:frame] inView:controlView];
}
于 2013-12-14T11:03:37.197 回答