Тень изображения NSButton при событии mouseEntered

У меня есть NSButton без полей, который содержит изображение и является подклассом моего класса ButtonEffect для обнаружения событий mouseEntered и mouseExited. Моя цель состоит в том, чтобы только край изображения светился, когда мышь входит в область кнопки. Я знаю, что могу добиться этого, используя два разных изображения (одно с тенью и другое без), но мне нужно сделать это с одним изображением.

Вот пример того, чего я надеюсь добиться для события mouseEntered: мышь вошла в область кнопки

А вот что должно получиться после того, как курсор покинет область кнопки: мышь вышла из области кнопки

Вот моя попытка установить фон ячейки, но он меняет цвет всей области кнопки.

#import "ButtonEffect.h"

@interface ButtonEffect ()

@property NSTrackingArea *trackingArea;

@end

@implementation ButtonEffect

- (void)updateTrackingAreas {
    [super updateTrackingAreas];

    if (_trackingArea) {
        [self removeTrackingArea:_trackingArea];
    }

    NSTrackingAreaOptions options = NSTrackingInVisibleRect | NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow;
    _trackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect options:options owner:self userInfo:nil];
    [self addTrackingArea:_trackingArea];
}

- (void)mouseEntered:(NSEvent *)event {
    [[NSCursor pointingHandCursor] set];
    [self.cell setBackgroundColor:NSColor.redColor];
    NSLog(@"mouse entered button");
}

- (void)mouseExited:(NSEvent *)event {
    [[NSCursor arrowCursor] set];
    [self.cell setBackgroundColor:nil];
    NSLog(@"mouse exited button");
}

@end

person wigging    schedule 25.08.2012    source источник


Ответы (1)


Вы хотите что-то вроде этого?

     - (void)mouseEntered:(NSEvent *)event {
    CALayer *lay=[btn layer];
    CGColorRef myColor=CGColorCreateGenericRGB(1, 1, 1, 1);
    CGColorRelease(myColor);
    myColor=CGColorCreateGenericRGB(0, 0, 0.8, 1);
    [lay setBorderColor:myColor];
    [lay setBorderWidth:1];
    [btn setWantsLayer:YES];
    [btn setLayer:lay];
    CGColorRelease(myColor);

}

- (void)mouseExited:(NSEvent *)event {
    CALayer *lay=[btn layer];
    CGColorRef myColor=CGColorCreateGenericRGB(1, 1, 1, 1);
    CGColorRelease(myColor);
    myColor=CGColorCreateGenericRGB(0, 0, 0.8, 1);
    [lay setBorderColor:myColor];
    [lay setBorderWidth:0];
    [btn setWantsLayer:YES];
    [btn setLayer:lay];
    CGColorRelease(myColor);

}
person Ramaraj T    schedule 09.10.2012
comment
@Suresh Да, я знаю, что могу сделать это, используя два разных изображения, но моя цель — использовать только одно изображение. - person wigging; 09.10.2012
comment
@Gavin Гэвин, я обновил свой ответ. Я использовал CALayer для эффекта свечения (не совсем так). Вы можете сделать некоторые модификации. - person Ramaraj T; 10.10.2012
comment
@Suresh Вы также можете добиться эффекта, используя NSShadow - person wigging; 11.10.2012