Изображение при наведении NSButtonCell, прозрачный фон при нажатии?

Я реализовал NSButton с изображением в нем.

Когда пользователь наводит на него курсор, изображение меняется на что-то другое, а затем обратно.


Нормальный статус:

введите здесь описание изображения

При наведении:

введите здесь описание изображения


Код, который я использую для NSButtonCell:

Интерфейс:

#import <Foundation/Foundation.h>

@interface DKHoverButtonCell : NSButtonCell 
{
    NSImage *_oldImage;
    NSImage *hoverImage;
}

@property (retain) NSImage *hoverImage;

@end

Реализация:

#import "DKHoverButtonCell.h"

@interface NSButtonCell()
- (void)_updateMouseTracking;
@end

@implementation DKHoverButtonCell

@synthesize hoverImage;

- (void)mouseEntered:(NSEvent *)event {
    if (hoverImage != nil && [hoverImage isValid]) {
        _oldImage = [[(NSButton *)[self controlView] image] retain];
        [(NSButton *)[self controlView] setImage:hoverImage];
    }
}

- (void)mouseExited:(NSEvent *)event {
    if (_oldImage != nil && [_oldImage isValid]) {
        [(NSButton *)[self controlView] setImage:_oldImage];
        [_oldImage release];
        _oldImage = nil;
    }
}

- (void)_updateMouseTracking {
    [super _updateMouseTracking];
    if ([self controlView] != nil && [[self controlView] respondsToSelector:@selector(_setMouseTrackingForCell:)]) {
        [[self controlView] performSelector:@selector(_setMouseTrackingForCell:) withObject:self];
    }
}

- (void)setHoverImage:(NSImage *)newImage {
    [newImage retain];
    [hoverImage release];
    hoverImage = newImage;
    [[self controlView] setNeedsDisplay:YES];
}

- (void)dealloc {
    [_oldImage release];
    [hoverImage release];
    [super dealloc];
}

@end

Теперь вот проблема:

  • хотя приведенные выше элементы управления работают на 100% (с закругленным изображением «X» и прозрачным фоном), когда пользователь щелкает по нему, он отображает «белый» фон и не сохраняет мой старый «прозрачный» фон
  • Как мне решить эту проблему?

person Dr.Kameleon    schedule 21.04.2012    source источник
comment
stackoverflow.com/questions/7756312/, stackoverflow.com/questions/4801418/, будет ли для вас достаточным решением установка типа ячейки кнопки на мгновенное изменение?   -  person Vervious    schedule 21.04.2012


Ответы (2)


Вам нужно изменить тип кнопки на Momentary Change. Вы можете изменить его в инспекторе атрибутов:

как это сделать

Или изменить программно:

[button setButtonType:NSMomentaryChangeButton];
person Justin Boo    schedule 21.04.2012
comment
Я знал, что это что-то до безобразия простое... Это был просто один из тех случаев, когда я просто не мог понять, что. Большое спасибо! :-) - person Dr.Kameleon; 22.04.2012
comment
@Dr.Kameleon Нет проблем, я рад, что помог Вам :) - person Justin Boo; 22.04.2012
comment
@JustinBoo: если вы можете мне помочь, пожалуйста. вопрос аналогичный предыдущему - person Anoop Vaidya; 15.04.2013

Но для вашего случая должно быть достаточно использовать свойство showsBorderOnlyWhileMouseInside NSButtonCell, которое существует с самого начала (OS X 10.0). Это покажет границу кнопки только тогда, когда мышь находится внутри кнопки. Объедините это со стилем границы, который заполнен и светло-серый, это будет довольно близко к результату, которого вы достигли.

Не требуется ни подклассов, ни использования недокументированных функций API (в вашем случае _updateMouseTracking).

closeButton.bezelStyle = .inline
closeButton.setButtonType(.momentaryPushIn)

if let buttonCell = closeButton.cell as? NSButtonCell {
    buttonCell.showsBorderOnlyWhileMouseInside = true
}
person adib    schedule 04.04.2018