Тип кнопки подкласса NSButtonCell не работает


Я создал подкласс класса 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

Как видите, я проверяю статус push in методом [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];
}

person v1Axvw    schedule 18.06.2011    source источник


Ответы (2)


Вы смотрите не на тот объект. -state — отмечена кнопка или нет. Вы хотите посмотреть isHighlighted, который сообщает вам, нажата ли ваша кнопка или нет.

Посмотрите на флажок:

Состояния флажка

Когда вы нажимаете и удерживаете его, флажок по-прежнему не установлен, но слегка затемняется (702). Затем, когда вы отпускаете мышь, она проверяет (704). Затем, когда вы снова нажимаете и удерживаете, отмеченный флажок темнеет, но все еще отмечен (705), и только когда вы отпускаете внутри, он фактически снимается (701).

Таким образом, есть два различных аспекта, выделение и состояние, которые в совокупности обеспечивают одно из 4 проявлений. Каждый NSButtonCell продвигает свое состояние к тому, что возвращает -nextState при каждом нажатии. Но некоторые типы кнопок показывают состояние, а другие нет. Посмотрите на любую кнопку (например, на кнопку «ОК» в диалоговом окне), и вы обнаружите, что за кулисами ее состояние меняется между включенным и выключенным, даже если она всегда рисует одинаково.

Это ваш код рисования, который смотрит на свойство -showsStateBy и показывает состояние только в том случае, если это указывает на то, что оно должно быть выполнено.

person uliwitness    schedule 17.10.2012

вы пробовали [self setButtonType:NSMomentaryLightButton]; в инициализации?

person Grady Player    schedule 19.06.2011