NSSavePanel аварийно завершает работу на Yosemite

Я использую NSSavePanel для сохранить изображение.

Я использовал IKSaveOption, который добавляется в NSSavePanel. Когда панель сохранения пытается открыть лист для окна, она вылетает, говоря:

*** Ошибка утверждения в -[IKSaveOptionsContainer _didChangeHostsAutolayoutEngineTo:], /SourceCache/AppKit/AppKit-1343.14/Layout.subproj/NSView_Layout.m:577 — следует преобразовать маску автоматического изменения размера в ограничения, если _didChangeHostsAutolayoutEngineTo:YES.

Я следую этому коду:

NSSavePanel *savePanel = [NSSavePanel savePanel];
    [savePanel setDirectoryURL:[NSURL URLWithString:NSHomeDirectory()]];
    [savePanel setDelegate:self];
    [savePanel setPrompt:NSLocalizedString(@"save",nil)];
    [savePanel setAllowedFileTypes:[NSArray  arrayWithObjects:@"png",@"jpeg",nil]];
      IKSaveOptions * opt = [[IKSaveOptions alloc] initWithImageProperties:nil
                                                          imageUTType:(NSString *)kUTTypePNG];
    [opt addSaveOptionsAccessoryViewToSavePanel:savePanel];
    [savePanel setExtensionHidden:NO];

   [savePanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result){.....
}

Этот код работает в Maverick, но не в Yosemite. Есть ли какие-либо изменения макета в новом API ОС?


person user3699036    schedule 09.12.2014    source источник
comment
вы нашли решение для этого?   -  person Duck    schedule 12.02.2015
comment
Аварии на Эль-Капе тоже. Я представил rdar. Пожалуйста, отправьте свой запрос, чтобы заставить Apple исправить это   -  person Marek H    schedule 22.09.2015


Ответы (2)


Update2: решение оказывается простым.

[self.saveOptions addSaveOptionsAccessoryViewToSavePanel:savePanel];
savePanel.accessoryView.translatesAutoresizingMaskIntoConstraints = YES;

Обновление: приведенный ниже обходной путь не меняет расширение имени файла, и в зависимости от того, как вы сохраняете файл, запрос на новый формат может не выполняться.

Я нашел обходной путь и отправил сообщение об ошибке в Apple (20595916). Обходной путь не очень хорош, потому что размер суперпредставления может быть недостаточным и обрезать элементы управления для параметров изображения.

NSView* view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 400, 200)];
view.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
savePanel.accessoryView = view;

[self.saveOptions addSaveOptionsToView:view];
person Jason    schedule 18.04.2015

Обходной путь El Capitan + Yosemite заключается в том, чтобы не добавлять его с помощью addSaveOptionsAccessoryViewToSavePanel, а использовать addSaveOptionsToView + обновить расширение вручную с помощью AllowFileTypes.

var saveOptions = IKSaveOptions()
var imageUTType = kUTTypeTIFF
var imageProperties: NSDictionary = Dictionary<String, String>()
var panel : NSSavePanel?

internal func prepareExportSavePanel(savePanel : NSSavePanel) -> Bool {
    panel = savePanel
    saveOptions = IKSaveOptions(imageProperties: imageProperties , imageUTType: imageUTType)
    saveOptions.delegate = self
    if #available(macOS 10.14, *) { //might work on earlier versions
        saveOptions.addAccessoryView(to: savePanel)
    } else {
        savePanel.accessoryView = NSView(frame: NSRect(x: 0, y: 0, width: 500, height: 200))
        saveOptions.add(to: savePanel.accessoryView)
    }

    return true
}

override func saveOptions(saveOptions: IKSaveOptions!, shouldShowUTType utType: String!) -> Bool {
    if (utType == "com.ilm.openexr-image") {
        return false
    }
    return true
}

@objc dynamic func saveOptionsChanged(_ sender: Any?) {
    imageProperties = saveOptions.imageProperties
    imageUTType = saveOptions.imageUTType
    panel?.allowedFileTypes = [imageUTType as String]
}

@objc dynamic open var canCalculateEstimatedSize : Bool {
    return false
}
person Marek H    schedule 17.08.2016