对NSButton的简单鼠标悬停效果

AP.*_*AP. 18 cocoa nsbutton nsbuttoncell

我正在NSButtonCell为自定义渲染创建自定义.

现在,我希望有不同的方面取决于鼠标是否在按钮上方.我怎样才能获得这些信息?

感谢致敬,

VSN*_*VSN 31

这是我创造并完美地为我工作的......

第1步:创建带跟踪区域的按钮

 NSButton *myButton = [[NSButton alloc] initWithFrame:NSMakeRect(100, 7, 100, 50)];
[myButton setTitle:@"sample"];

[self.window.contentView addSubview:myButton];
// Insert code here to initialize your application
NSTrackingArea* trackingArea = [[NSTrackingArea alloc]
                                initWithRect:[myButton bounds]
                                options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways
                                owner:self userInfo:nil];
[myButton addTrackingArea:trackingArea];
Run Code Online (Sandbox Code Playgroud)

步骤:2实现以下方法

- (void)mouseEntered:(NSEvent *)theEvent{
NSLog(@"entered");
[[myButton cell] setBackgroundColor:[NSColor blueColor]];


}

- (void)mouseExited:(NSEvent *)theEvent{
[[myButton cell] setBackgroundColor:[NSColor redColor]];
NSLog(@"exited");

}
Run Code Online (Sandbox Code Playgroud)


bal*_*630 15

斯威夫特3:

使用代码创建按钮或只使用它的@IBOutlet.然后定义按钮的鼠标悬停跟踪区域(悬停):

let area = NSTrackingArea.init(rect: yourButtonName.bounds,
                               options: [.mouseEnteredAndExited, .activeAlways], 
                               owner: self, 
                               userInfo: nil)
yourButtonName.addTrackingArea(area)
Run Code Online (Sandbox Code Playgroud)

然后覆盖mouseEntered和mouseExited,在这些函数中设置要更改的内容(按钮颜色,按钮图像,按钮文本,..):

override func mouseEntered(with event: NSEvent) {
    print("Entered: \(event)")
}

override func mouseExited(with event: NSEvent) {
    print("Exited: \(event)")
}
Run Code Online (Sandbox Code Playgroud)

如果您有多个按钮(每个按钮都添加了跟踪区域)并且您需要确定触发mouseEntered事件的按钮,则可以为此添加一些userInfo信息,因此不是:

userInfo: nil
Run Code Online (Sandbox Code Playgroud)

在userInfo中为每个按钮添加自定义按钮名称,例如:

userInfo: ["btnName": "yourButtonName"]
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的mouseEntered和mouseExited函数中编写一个switch-case或if语句,如下所示:

override func mouseEntered(with event: NSEvent) {
        // Identify which button triggered the mouseEntered event
        if let buttonName = event.trackingArea?.userInfo?.values.first as? String {
            switch (buttonName) {
            case "yourButtonName":
                //do whatever you want for this button..
            case "anotherButtonName":
                //do whatever you want for this button..
            default:
                print("The given button name: \"\(buttonName)\" is unknown!")
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


Dim*_*ian 10

您需要对NSButton类进行子类化(甚至更好的是NSButtonCell类).正如贾斯汀所说,如果你把这两种方法

- (void)mouseEntered:(NSEvent *)theEvent;
- (void)mouseExited:(NSEvent *)theEvent;
Run Code Online (Sandbox Code Playgroud)

当鼠标进入和退出该区域时,应该调用它们.您可能还需要重新创建跟踪区域,请在此处查看:

- (void)updateTrackingAreas
Run Code Online (Sandbox Code Playgroud)

对于淡入和淡出效果,我使用动画师和alpha值进行播放,例如:

[self animator]setAlphaValue:0.5]; 
Run Code Online (Sandbox Code Playgroud)


小智 7

带回调的 Swift 5 版本,超级好用:

final class HoverButton: NSButton {

    private let callback: (HoverButton, Bool) -> Void

    init(callback: @escaping (HoverButton, Bool) -> Void) {
        self.callback = callback
        super.init(frame: .zero)
        let area = NSTrackingArea(rect: .zero, options: [.mouseEnteredAndExited, .activeAlways, .inVisibleRect], owner: self, userInfo: nil)
        addTrackingArea(area)
    }

    @available(*, unavailable)
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func mouseEntered(with event: NSEvent) {
        super.mouseEntered(with: event)
        callback(self, true)
    }

    override func mouseExited(with event: NSEvent) {
        super.mouseExited(with: event)
        callback(self, false)
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

let button = HoverButton { button, isHovered in
    button.animator().alphaValue = isHovered ? 1 : 0.5
}
Run Code Online (Sandbox Code Playgroud)