imageRectForBounds не вызывается в подклассе NSButtonCell

Мне нужно было создать NSButton с изображением и заголовком, но мне не понравился ни один из стандартных методов позиционирования в какао.

Я решил создать подкласс ячейки кнопки и переопределить -imageRectForBounds: а также -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

1 ответ

С небольшой отладкой я понимаю, что по умолчанию 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];
}
Другие вопросы по тегам