2012-06-25 18 views
27

में 0xऔर mouseExited ईवेंट कैप्चर करने के लिए NSImageView का सबक्लास बनाया गया। लेकिन केवल mouseUp और mouseDown ईवेंट कह रहे हैं। mouseEntered और mouseExitedNSImageView सबक्लास में ईवेंट कैप्चर कैसे करें?माउस एन्टरेटेड और माउस एक्स्क्टेड एनएसआईमेज व्यू सबक्लास

उत्तर

69

यदि आप 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]; 
} 
+36

बस एक और एप्पल के API पल "क्यों मैं इस बकवास से निपटने के लिए करते हैं"। – ArtOfWarfare

+14

@ArtOfWarfare या यह एक जटिल दृश्य पदानुक्रम होने की वास्तविकता है और संभावित रूप से सैकड़ों हजार तरीकों का आह्वान नहीं करना चाहता है जब उपयोगकर्ता यूआई के एक हंक पर पॉइंटर को स्लाइड करता है। यह पुराना है ** कभी मतदान नहीं, हमेशा खींचें। ** – bbum

+0

बिंगू, आकर्षण की तरह काम किया – Pete

5

स्विफ्ट @Justin Boo के जवाब के 3 संस्करण:

private var trackingArea: NSTrackingArea? 

override func 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) 
}