macos - NSSavePanel se bloquea en Yosemite
operating-system osx-yosemite (2)
La solución alternativa de El Capitan + Yosemite es evitar agregarla con addSaveOptionsAccessoryViewToSavePanel, pero usar addSaveOptionsToView + actualizar manualmente la extensión con 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 as! [NSObject : AnyObject], imageUTType: imageUTType as String)
saveOptions.delegate = self
savePanel.accessoryView = NSView(frame: NSRect(x: 0, y: 0, width: 500, height: 200))
saveOptions.addSaveOptionsToView(savePanel.accessoryView)
return true
}
override func saveOptions(saveOptions: IKSaveOptions!, shouldShowUTType utType: String!) -> Bool {
if (utType == "com.ilm.openexr-image") {
return false
}
return true
}
func saveOptionsChanged(sender : AnyObject) {
imageProperties = saveOptions.imageProperties
imageUTType = saveOptions.imageUTType
panel?.allowedFileTypes = [imageUTType as String]
}
Estoy usando NSSavePanel para guardar la imagen.
He usado IKSaveOption que se agrega al NSSavePanel. Cuando el panel de salvar intenta abrir la hoja para la ventana, se bloquea diciendo:
*** Error de aserción en - [IKSaveOptionsContainer _didChangeHostsAutolayoutEngineTo:], /SourceCache/AppKit/AppKit-1343.14/Layout.subproj/NSView_Layout.m:577 - Debe traducir el aumento de la máscara en restricciones si _didChangeHostsAutolayoutEngineTo: YES.
Estoy siguiendo este código:
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){.....
}
Este código funciona en Maverick, pero no en Yosemite. ¿Hay algún cambio de diseño en la nueva API del sistema operativo?
Actualización2: la solución resulta ser simple.
[self.saveOptions addSaveOptionsAccessoryViewToSavePanel:savePanel];
savePanel.accessoryView.translatesAutoresizingMaskIntoConstraints = YES;
Actualización: la solución siguiente no cambia la extensión del nombre de archivo y, dependiendo de cómo guarde el archivo, es posible que no se respete la nueva solicitud de formato.
Encontré una solución, y archivé un error con Apple (20595916). La solución alternativa no es excelente porque el tamaño de la supervista podría ser inadecuado y recortar los controles para las opciones de imagen.
NSView* view = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 400, 200)];
view.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable;
savePanel.accessoryView = view;
[self.saveOptions addSaveOptionsToView:view];