2011-02-13 13 views
18

मेरे पास एक परिवर्तनीय लंबाई NSStatusItem है जो भी जब भी संभव हो, मैं दृश्यमान रहना चाहता हूं, भले ही इसका मतलब केवल कुछ सामग्री दिखा रहा हो, लेकिन जब मेरा आइटम किसी एप्लिकेशन के मेनू बार में चलाने के लिए पर्याप्त हो, तो यह पूरी तरह छुपा हुआ है। क्या यह कहने का कोई तरीका है कि ऐसा कब होता है ताकि मैं उपलब्ध स्थान को फिट करने के लिए दृश्य को छोटा कर सकूं?क्या एक एनएसएसटीटस इटिम फिट हो सकता है?

मैंने कस्टम दृश्य के साथ प्रयोग किया है, सभी viewWill* विधियों, फ्रेम सेटर्स, और प्रदर्शन विधियों को ओवरराइड कर रहा है, और समय-समय पर जांच कर रहा है कि युक्त विंडो स्थानांतरित हो गई है या छुपा हुआ है या नहीं। मुझे यह बताने का कोई तरीका नहीं मिल रहा है कि मेरा आइटम कब लंबा है।

+1

यदि यह मदद करता है, तो मैंने कभी ऐसा ऐप नहीं देखा है जो ऐसा करता है। –

उत्तर

1

यह इस बात पर निर्भर करता है कि आपका स्टेटस आइटम एप्लिकेशन ओएस एक्स मेनू बार में मेनू आइटमों की संख्या का पता लगा सकता है या नहीं। सेब दस्तावेज के माध्यम से एक त्वरित खोज से पता चलता है कि ऐसा करने के उद्देश्य से ऐप्पल द्वारा प्रदान की गई कोई सार्वजनिक एपीआई नहीं है। मेरे ज्ञान के लिए, कोई भी निजी उपलब्ध नहीं है।

तो मैं इसके बजाय अनुशंसा करता हूं कि आप डिफ़ॉल्ट रूप से अपना स्टेटस आइटम छोटा करें और उपयोगकर्ता द्वारा क्लिक किए जाने पर विस्तारित किया जाए।

संपादित करें: यदि आपकी स्थिति आइटम को छिपा जा रहा है पता लगाने के लिए एक बहुत चालाक रास्ता: असल में चर्चा here को देखो। तो एक बार जब आपको पता चला कि यह छुपाया जा रहा है, तो आप इसे कम कर सकते हैं ताकि यह फिर से दिखाई दे।

self.statusItem.title = @"Message that will be truncated as necessary."; 
while (self.statusItem.title.length > 0) { 
    CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenAboveWindow, (CGWindowID)self.statusItemWindow.windowNumber); 
    if (CFArrayGetCount(windowList) > 1) { 
     CFRelease(windowList); 
     self.statusItem.title = [self.statusItem.title substringToIndex:self.statusItem.title.length - 1]; 
    } else { 
     CFRelease(windowList); 
     break; 
    } 
} 

एक मुश्किल बात यह है कि बनी हुई है NSStatusItem खिड़की हो रही है:

+0

यह सामान्य रूप से उचित अनुशंसा है, और यह प्रश्न इतने लंबे समय से खुला रहा है कि मुझे संदेह है कि सकारात्मक में जवाब होगा। :) – alltom

+0

मैंने अभी आपका संपादन देखा है! बहुत बहुत धन्यवाद! – alltom

1

यहां एक संपूर्ण काम कर उदाहरण चर्चा के आधार पर कि संदर्भित hollow7 है। अब तक, मुझे इसे प्राप्त करने के लिए दो विधियां मिली हैं।

1 - _window नामक एक निजी विधि है। आप इसे इस तरह का उपयोग कर सकते हैं:

self.statusItemWindow = [self.statusItem performSelector:@selector(_window)]; 

2 - यह थोड़ा और अधिक जटिल है, लेकिन मुझे लगता है कि यह अधिक मैक App स्टोर में निजी विधि के उपयोग के लिए एप्पल के स्थिर विश्लेषण पारित करने के लिए की संभावना है:

सेट लक्ष्य और NSStatusItem की कार्रवाई एक विधि आप नियंत्रित करते हैं, इस तरह के:

self.statusItem.target = self; 
self.statusItem.action = @selector(itemClicked:); 

तब लागू विधि में खिड़की का उपयोग:

- (void)itemClicked:(id)sender { 
    self.statusItemWindow = [[NSApp currentEvent] window]; 
} 
संबंधित मुद्दे