NSSavePanel在优胜美地坠毁

时间:2014-12-09 08:27:44

标签: macos osx-yosemite nssavepanel nspanel iksaveoptions

我正在使用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中是否有任何布局更改?

2 个答案:

答案 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
}