【发布时间】:2012-06-26 15:09:41
【问题描述】:
我创建了NSImageView 的子类来捕获mouseEntered 和mouseExited 事件。
但只有mouseUp 和mouseDown 事件被调用。如何捕获NSImageView子类中的mouseEntered和mouseExited事件?
【问题讨论】:
标签: objective-c macos cocoa nsimageview
我创建了NSImageView 的子类来捕获mouseEntered 和mouseExited 事件。
但只有mouseUp 和mouseDown 事件被调用。如何捕获NSImageView子类中的mouseEntered和mouseExited事件?
【问题讨论】:
标签: objective-c macos cocoa nsimageview
如果你想使用mouseEntered:和mouseExited:你需要使用NSTrackingArea。这是参考NSTrackingArea Class Reference。
示例:
//Add this to Your imageView subclass
-(void)mouseEntered:(NSEvent *)theEvent {
NSLog(@"Mouse entered");
}
-(void)mouseExited:(NSEvent *)theEvent
{
NSLog(@"Mouse exited");
}
-(void)updateTrackingAreas
{
[super updateTrackingAreas];
if(trackingArea != nil) {
[self removeTrackingArea:trackingArea];
[trackingArea release];
}
int opts = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways);
trackingArea = [ [NSTrackingArea alloc] initWithRect:[self bounds]
options:opts
owner:self
userInfo:nil];
[self addTrackingArea:trackingArea];
}
【讨论】:
Swift 4 版本的Justin Boo's answer
override func updateTrackingAreas() {
super.updateTrackingAreas()
for trackingArea in self.trackingAreas {
self.removeTrackingArea(trackingArea)
}
let options: NSTrackingArea.Options = [.mouseEnteredAndExited, .activeAlways]
let trackingArea = NSTrackingArea(rect: self.bounds, options: options, owner: self, userInfo: nil)
self.addTrackingArea(trackingArea)
}
【讨论】:
Swift 3 版本@Justin Boo的回答:
private var trackingArea: NSTrackingArea?
override func updateTrackingAreas() {
super.updateTrackingAreas()
if let trackingArea = self.trackingArea {
self.removeTrackingArea(trackingArea)
}
let options: NSTrackingAreaOptions = [.mouseEnteredAndExited, .activeAlways]
let trackingArea = NSTrackingArea(rect: self.bounds, options: options, owner: self, userInfo: nil)
self.addTrackingArea(trackingArea)
}
【讨论】:
Justin Boo 的答案的 C# Xamarin 版本
public override void UpdateTrackingAreas ()
{
base.UpdateTrackingAreas ();
foreach (var item in TrackingAreas ()) {
RemoveTrackingArea (item);
}
var options = NSTrackingAreaOptions.MouseEnteredAndExited | NSTrackingAreaOptions.ActiveAlways;
var trackingArea = new NSTrackingArea (this.Bounds, options, this, null);
AddTrackingArea (trackingArea);
}
【讨论】: