2011-01-07 22 views
18

मुझे यह पता लगाने की ज़रूरत है कि माउस स्थिति एनएसवी व्यू के अंदर है या नहीं।माउस को देखने के लिए कैसे खोजें

मैं NSPointInRect(point, rect) का उपयोग करता हूं, लेकिन मुझे रेक्ट समन्वय को स्क्रीन निर्देशांक में कनवर्ट करने की आवश्यकता होगी और मुझे यकीन नहीं है कि कैसे। कोई भी सहायताकाफी प्रशंसनीय होगी!

+0

क्या आप हमें एक कारण बता सकते हैं? आम तौर पर यह तकनीक एक अच्छा विचार नहीं है, लेकिन यह जानने के बिना कहना मुश्किल है कि आप क्या लिख ​​रहे हैं। –

उत्तर

22

उपयोग NSView के convertPoint: fromView: साथ विधि रूप शून्यfromView विंडो में एक बिंदु भी बयान के लिए एक दृश्य के समन्वय प्रणाली को समन्वय करता है। inRect: पूर्व भी फ़्लिप समन्वय प्रणाली के लिए खातों के रूप में NSPointInRect के बजाय विधि

देखने के समन्वय प्रणाली के लिए माउस बिंदु परिवर्तित करने के बाद, मैं NSView के माउस का प्रयोग करेंगे।

वैकल्पिक रूप से, आप Tracking Area Object का उपयोग कर सकते हैं।

+1

NSTrackingArea बिल्कुल वही था जो मैं ढूंढ रहा था! धन्यवाद! –

+1

मैं इसे बांध रहा हूं ... लेकिन कन्वर्टपॉइंट फ़ंक्शन वास्तव में एक NSPoint ऑब्जेक्ट को इसके पहले पैरामीटर के रूप में पूछता है। मुझे क्या देना चाहिए कृपया विस्तृत करें। –

+2

मैं यह जोड़ना चाहता हूं कि आपको 'एनएसवीईटी' माउस में 'एनएसआरईटीई' तर्क के लिए 'self.bounds' पास करना होगा: inRect: 'self.frame' को भेजना समन्वय को ऑफसेट करेगा। – ColdSteel

33

कुछ इस तरह आप के लिए काम करना चाहिए:

NSView* myView; // The view you are converting coordinates to 
NSPoint globalLocation = [ NSEvent mouseLocation ]; 
NSPoint windowLocation = [ [ myView window ] convertScreenToBase: globalLocation ]; 
NSPoint viewLocation = [ myView convertPoint: windowLocation fromView: nil ]; 
if(NSPointInRect(viewLocation, [ myView bounds ])) { 
    // Do your thing here 
} 

मैं व्यक्तिगत रूप से इस कई स्थानीय चर का उपयोग नहीं है, लेकिन उम्मीद है कि इस इस उदाहरण स्पष्ट करने।

+0

एनएसईएंडेंट में पहले से ही एक [ईवेंट स्थान इनविंडो] है इसलिए पहली 3 लाइनें अनावश्यक हैं –

+1

स्थान इनविंडो शायद अधिकतर समय काम करेगा। लेकिन यह ऐप्पल प्रलेखन से है: "एनएसएमआईएस के साथ और संभवतः अन्य घटनाओं के साथ, रिसीवर के पास एक शून्य खिड़की हो सकती है (यानी, विंडो रिटर्न शून्य)। इस मामले में, locationInWindow स्क्रीन निर्देशांक में ईवेंट स्थान देता है।" तो ऐसा लगता है कि स्थान पर निर्भर नहीं हैविंडो अधिक मजबूत हो सकता है।यदि आपके पास पहले से ही कोई ईवेंट है तो स्थान इनविंडो निश्चित रूप से उपयोग करने के लिए कॉल होगा। मेरे उत्तर में विधि काम करेगी भले ही आपके पास पहले से कोई ईवेंट ऑब्जेक्ट न हो। –

5

कुछ माउस का इस्तेमाल कर रही कोड: inRect: (वैसे सिफारिश की; कि फ़्लिप निर्देशांक के लिए खातों) इन उत्तरों की

CGPoint point = [self convertPoint:[event locationInWindow] fromView:nil]; 
CGRect rect = [self bounds]; 
if ([self mouse:point inRect:rect]) { 
} 
1

कोई नहीं खाता है कि एक दृश्य आयताकार नहीं हो सकता है में रखते हैं।

यहां एक सार्वभौमिक विधि है जो गैर-आयताकार विचारों पर भी काम करती है। घड़ी-चेहरा या जटिल पथ आकार सोचें।

यह कोड स्निपेट आपको ग्लोबलपॉइंट (उर्फ ग्लोबल टोलोकल) से स्थानीयपॉइंट देगा। (0,0 विंडो स्पेस में ग्लोबलपॉइंट) यदि आप "toView" में तर्क बदलते हैं तो आपको "localToGlobal" बिंदु मिलता है।

let localPoint = convertPoint(aPoint, fromView: self.window?.contentView)  

यदि बिंदु पथ के अंदर था या नहीं तो बोले कोड सही या गलत वापस आ जाएगा।

CGPathContainsPoint(someCGPath,nil,localPoint,true)

नोट:

(self.window?.mouseLocationOutsideOfEventStream)! 

नोट: वहाँ एक अधिक सही हो सकता है aPoint एक globalPoint hitTest में पैरामीटर से ली गई है, यह भी से प्राप्त किया जा सकता है ऐसा करने का तरीका। लेकिन यह काम करता है, और फ्लिप किए गए विचारों की परवाह नहीं करता है।

+0

ऊपर वर्णित दृष्टिकोण के साथ भी अभी भी नुकसान हैं। उदाहरण के लिए एनएसवीव्स के पदानुक्रम के अंदर टेक्स्टफिल्ड को हिट करने के लिए मुझे क्लीन समाधान खोजने में बहुत परेशानी थी। चूंकि ऐप्पल हिट करने की बात करते समय अपनी रणनीति बदलता है, तो फ़ील्ड फ़ील्ड को टेस्ट करने के लिए आपको भी अपनाना होगा। मुझे यह काम करने और इसकी काफी साफ करने का एक तरीका मिला है। हालांकि बीमार शायद पदानुक्रम में प्रत्येक दृश्य में प्रत्येक हिटटेस्टपॉइंट को फ़्लिप करना और ऑफसेट करना शुरू कर देता है क्योंकि ऐसा लगता है कि सेब उनके घटकों के साथ क्या करता है। बस इसे एक विधि में जोड़ें जो मैं उपयोग किए गए प्रत्येक व्यू क्लास में शामिल है। – eonist

+0

यह एक बहुत ही "असंगठित" लेख है लेकिन यह आपको कुछ अंतर्दृष्टि दे सकता है जो कोशिश नहीं करना है। http://stylekit.org/blog/2016/01/28/Hit-testing-sub-views/ (मूल रूप से हिटटेस्टिंग शोध से मेरे सभी नोट्स) Ive तब से चले गए जब हिटटेस्टिंग की बात आती है और एक साफ वर्कफ़्लो होता है। – eonist

संबंधित मुद्दे