2015-02-02 15 views
13

Trong ứng dụng OS X của tôi, tôi muốn cho phép người dùng chỉnh sửa hình ảnh với các tiện ích mở rộng hành động thích hợp được cài đặt trên máy Mac, ví dụ như tiện ích đánh dấu hình ảnh như trong Mail.app hoặc TextEdit (dành cho các tệp RTFD có hình ảnh) - hoặc công cụ sửa chữa của Pixelmator nếu có. Theo như tôi có thể nhớ lại, Apple thông báo tại WWDC '14 sẽ có một API công khai cho nhiệm vụ này.Sử dụng tiện ích Chỉnh sửa hình ảnh trên Yosemite trong ứng dụng riêng

Rất tiếc, tôi không thể tìm thấy bất kỳ điểm bắt đầu nào về cách sử dụng tiện ích mở rộng từ phối cảnh ứng dụng máy chủ, không phải tài liệu cũng như mã mẫu.

tôi phát hiện ra rằng bạn phải thiết lập thuộc tính phong cách không có giấy tờ của NSSharingPicker đến một giá trị khác không như thế này:

- (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]; 
} 

Khi giá trị phong cách được thiết lập, bạn biết bạn là đi đúng hướng bởi vì - (NSArray *)sharingServicePicker:(NSSharingServicePicker *)sharingServicePicker sharingServicesForItems:(NSArray *)items proposedSharingServices:(NSArray *)proposedServices được gọi với các tiện ích chỉnh sửa hình ảnh được cài đặt trên hệ thống của tôi, thay vì các tiện ích chia sẻ thông thường.

Bạn cũng cần phải thực hiện một phương pháp đại biểu không có giấy tờ:

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

Nhưng vẫn còn, bảng chọn không hiển thị. Tất cả những gì tôi nhận được là một số đường viền kỳ lạ xung quanh nút sender.

+0

Bạn có chơi với '-sharingService: sourceFrameOnScreenForShareItem: '' - sharingService: transitionImageForShareItem: contentRect: 'và' -sharingService: sourceWindowForShareItems: sharingContentScope: '? – catlan

+0

Có, tôi đã triển khai tất cả các phương pháp này. Không tạo ra bất kỳ sự khác biệt nào. Tôi không đến mức họ được gọi. – iljawascoding

+0

Gửi email <[email protected]> hoặc gửi yêu cầu nâng cao (báo cáo lỗi @: ) và yêu cầu câu trả lời chính thức. – geowar

Trả lời

3

Thật không may, có vẻ như Apple chỉ thực sự hiển thị Tiện ích mở rộng hành động thông qua NSTextView tại thời điểm hiện tại.

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

Đó có thể đạt được bằng cách tạo ra một NSTextView và chèn một hình ảnh vào nó như là một NSFileWrapper, ví dụ (mã này chuyển thể từ TextEdit):

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

(Lưu ý rằng chèn hình ảnh dưới dạng NSTextAttachmentCell gây ra sự cố lạ - rdar://20333977)

Đường viền lạ mà bạn đề cập có vẻ là Bộ chọn dịch vụ chia sẻ được hiển thị khi di chuột qua hình ảnh trong NSTextView, tuy nhiên hơi bị che khuất bởi nút.

NSButton displaying private NSSharingServicePicker menu

Tôi vấp vào your GitHub repo và đã đóng góp những gì tôi đã học được về nó trong this pull request.

Tôi đã đạt được cách giải quyết hacky bằng cách trình bày NSSharingServicePicker như được mô tả trong câu hỏi của bạn và sau đó giữ trên NSSharingService s được trả lại trong sharingServicePicker:sharingServicesForItems:proposedSharingServices:. Bản thân các dịch vụ có thể được gọi với performWithItems: và dữ liệu được trả về trong sharingService:didShareItems:.

Mã của tôi có sẵn here.

0

Trên thực tế, hack "phong cách" bất động sản và thực hiện NSSharingServicePickerDelegate là không cần thiết, đoạn code sau đủ điều kiện hơn (tất nhiên, bạn nên thực hiện giao thức NSSharingServiceDelegate):

- (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]]; 
} 
Các vấn đề liên quan