4

我正在使用NSSavePanel保存图像。

我使用了添加到NSSavePanel的 IKSaveOption。当保存面板尝试为窗口打开工作表时,它会崩溃说 -

*** -[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。新的 OS API 中是否有任何布局更改?

4

2 回答 2

3

更新2:解决方案很简单。

[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];
于 2015-04-18T00:01:12.417 回答
0

El Capitan + Yosemite 解决方法是避免使用 addSaveOptionsAccessoryViewToSavePanel 添加它,但使用 addSaveOptionsToView + 使用 allowedFileTypes 手动更新扩展

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
}
于 2016-08-17T16:08:58.757 回答