2015-02-02 6 views
13

मेरे ओएस एक्स ऐप में, मैं उपयोगकर्ता को अपने मैक पर स्थापित उचित क्रिया एक्सटेंशन के साथ छवियों को संपादित करना चाहता हूं, उदाहरण के लिए Mail.app में मौजूद छवि मार्कअप एक्सटेंशन या TextEdit (छवियों के साथ आरटीएफडी फाइलों के लिए) - या उपलब्ध होने पर पिक्सेलमेटर की मरम्मत उपकरण। जहां तक ​​मुझे याद है, ऐप्पल ने डब्ल्यूडब्ल्यूडीसी '14 में घोषणा की है कि इस कार्य के लिए एक सार्वजनिक एपीआई होगी।अपने ऐप में Yosemite पर छवि संपादन एक्सटेंशन का उपयोग

दुर्भाग्य से मुझे मेजबान ऐप परिप्रेक्ष्य से एक्सटेंशन का उपयोग करने के तरीके पर कोई प्रारंभिक बिंदु नहीं मिल रहा है, न तो दस्तावेज़- न ही नमूना-कोड-वार।

मुझे पता चला एक गैर शून्य मान इस तरह के NSSharingPicker की गैर-दस्तावेजी शैली गुण सेट करने के लिए है कि आप:

- (IBAction)testSharingPicker:(id)sender 
{ 
    NSSharingServicePicker *picker = [[NSSharingServicePicker alloc] initWithItems:@[[self.listing.images.firstObject thumbImage]]]; 

    [picker setValue:@(1) forKey:@"style"]; 
    [picker setDelegate:self]; 

    [picker showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMinYEdge]; 
} 

एक बार शैली मूल्य सेट कर दिया जाता है, तो आप जानते हैं कि आप सही रास्ते पर हैं , क्योंकि - (NSArray *)sharingServicePicker:(NSSharingServicePicker *)sharingServicePicker sharingServicesForItems:(NSArray *)items proposedSharingServices:(NSArray *)proposedServices को नियमित रूप से साझाकरण एक्सटेंशन की बजाय, मेरे सिस्टम पर स्थापित छवि संपादन एक्सटेंशन के साथ बुलाया जाता है।

- (BOOL)sharingServicePicker:(NSSharingServicePicker *)sharingService shouldShowForView:(NSView*) inView 
{ 
    return YES; 
} 

लेकिन फिर भी, पिकर नहीं दिखा रहा है:

तुम भी एक गैर-दस्तावेजी प्रतिनिधि विधि को लागू करने की जरूरत है। मुझे लगता है कि sender बटन के आसपास कुछ अजीब सीमा है।

+0

आप '-sharingService के साथ खेलते हैं क्या: '' - साझाकरण सेवा: संक्रमण ImageForShareItem: contentRect: 'और' -sharingService: SourceWindowForShareItems: SharingContentScope: '? – catlan

+0

हां, मैंने इन सभी तरीकों को लागू किया। कोई फर्क नहीं पड़ता। मैं उस बिंदु पर नहीं पहुंचता जहां उन्हें बुलाया जाता है। – iljawascoding

+0

ईमेल <[email protected]> या एक एन्हांसमेंट अनुरोध फ़ाइल करें (बग रिपोर्ट @: ) और आधिकारिक उत्तर का अनुरोध करें। – geowar

उत्तर

3

दुर्भाग्यवश, ऐसा लगता है कि ऐप्पल केवल वर्तमान समय में NSTextView के माध्यम से एक्शन एक्सटेंशन का खुलासा करता है।

On OS X, NSTextView plays the central role in presenting Extensions to the users.

यह एक NSTextView (इस कोड TextEdit से रूपांतरित) बनाने और NSFileWrapper के रूप में यह में एक छवि डालने, उदाहरण के लिए द्वारा प्राप्त है:

NSMutableAttributedString *attachments = [[NSMutableAttributedString alloc] init]; 
NSError *error; 
    NSFileWrapper *wrapper = [[NSFileWrapper alloc] initWithURL:[NSURL fileURLWithPath:@"/Users/user/Downloads/Test.png"] options:NSFileWrapperReadingImmediate error:&error]; 
    if (wrapper) { 
     NSTextAttachment *attachment = [[NSTextAttachment alloc] initWithFileWrapper:wrapper]; 
     [attachments appendAttributedString:[NSAttributedString attributedStringWithAttachment:attachment]]; 
} 

if ([attachments length] > 0) { 
    NSRange selectionRange = [self.textView selectedRange]; 
    if ([self.textView shouldChangeTextInRange:selectionRange replacementString:[attachments string]]) { 
     [[self.textView textStorage] replaceCharactersInRange:selectionRange withAttributedString:attachments]; 
     [self.textView didChangeText]; 
    } 
} 

NSTextView displaying Extensions

(ध्यान दें कि एक छवि कोके रूप में डालनेएक अजीब दुर्घटना का कारण बनता है - rdar://20333977)

आपके द्वारा उल्लेख की जाने वाली अजीब सीमा साझाकरण सेवा पिकर प्रतीत होती है जो NSTextView में किसी छवि पर होवर करते समय दिखाया गया है, हालांकि बटन से थोड़ा अस्पष्ट है।

NSButton displaying private NSSharingServicePicker menu

मैं your GitHub repo पर ठोकर खाई और मैं क्या this pull request में इसके बारे में सीखा है योगदान दिया है।

मैंने आपके प्रश्न में वर्णित NSSharingServicePicker प्रस्तुत करके एक हैकी वर्कअराउंड हासिल किया है और फिर पर sharingServicePicker:sharingServicesForItems:proposedSharingServices: में लौटाया है। सेवाओं को स्वयं performWithItems: के साथ बुलाया जा सकता है और डेटा sharingService:didShareItems: में वापस कर दिया जाता है।

मेरा कोड here उपलब्ध है।

0

वास्तव में, हैकिंग "शैली" संपत्ति और लागू करने NSSharingServicePickerDelegate अनावश्यक हैं, निम्नलिखित कोड अधिक योग्य है (निश्चित रूप से, आप NSSharingServiceDelegate प्रोटोकॉल लागू होना चाहिए): sourceFrameOnScreenForShareItem:

- (IBAction)onServiceBtnClick:(id)sender { 
NSURL *url = [self.quickLookItems firstObject]; 
NSImage *image = [[NSImage alloc] initWithContentsOfURL:url]; 
if (image) { 
    self.serviceBtn.hidden = YES; 

    NSMenu *menu = [[NSMenu alloc] initWithTitle:@"Sharing"]; 

    NSSharingService *service = [NSSharingService sharingServiceNamed:@"com.apple.Preview.Markup"]; 
    service.delegate = self; 
    self.markupService = service; 
    NSArray *services = @[ service ]; 

    for (NSSharingService *service in services) { 
     NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle:service.title action:@selector(share:) keyEquivalent:@""]; 
     [menu addItem:menuItem]; 
    } 

    [menu popUpMenuPositioningItem:nil atLocation:[NSEvent mouseLocation] inView:nil]; 


    } 
} 

- (void)share:(NSMenuItem *)sender{ 
    NSURL *imageURL = [self.quickLookItems firstObject]; 
    [self.markupService performWithItems:@[imageURL]]; 
} 
संबंधित मुद्दे