我正在使用NSSavePanel来保存图片。
我使用了IKSaveOption,它被添加到NSSavePanel中。 当保存面板尝试打开窗口的工作表时,它崩溃说 -
***断言失败 - [IKSaveOptionsContainer _didChangeHostsAutolayoutEngineTo:],/ SourceCache / AppKit / AppKit-1343.14 / Lightsout.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中是否有任何布局更改?
答案 0 :(得分:3)
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];
答案 1 :(得分: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
}