【问题标题】:NSButton image shadow on mouseEntered eventmouseEntered 事件上的 NSButton 图像阴影
【发布时间】:2012-08-20 13:56:01
【问题描述】:

我有一个无边框的 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

【问题讨论】:

    标签: objective-c cocoa mouseevent nsbutton nsevent


    【解决方案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);
    
    }
    

    【讨论】:

    • @Suresh 是的,我知道我可以使用两张不同的图片来实现这一点,但我的目标是只使用一张图片。
    • @Gavin 我已经更新了我的答案。我已经使用 CALayer 来实现发光效果(不完全是)。你可以做一些修改。
    • @Suresh 你也可以使用NSShadow来完成效果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-24
    相关资源
    最近更新 更多