我写一个Skethc 插件<<Sketch完美生成多尺寸App图标插件>> http://www.jianshu.com/p/3d5ce8d48066 , 输出各种尺寸多人反应在新版本下无法输出,有人告诉我是42版本.
我在42下运行这个插件,果然无法输出
Paste_Image.png默认 20:13:24.534638 +0800 Sketch Exception: TypeError: MSExportRequest.requestWithRect_scale_ is not a function. (In 'MSExportRequest.requestWithRect_scale_( rect ,scale)', 'MSExportRequest.requestWithRect_scale_' is undefined)
这里指明源码大概位置
sourceURL: /Users/pro/Library/Application Support/com.bohemiancoding.sketch3/Plugins/AppAssetsExport.sketchplugin/Contents/Sketch/export.js
column: 50
这个很明显,是[ MSExportRequest requestWithRect: scale:] 这个方法没有了.
出问题是一个核心方法
function exportLayerToPath(layer, path, scale, format, suffix) {
if(getSketchVersionNumber() >= 350) {
var rect = layer.absoluteRect().rect(),
slice = [MSExportRequest requestWithRect:rect scale:scale],
layerName = layer.name() + ((typeof suffix !== 'undefined') ? suffix : ""),
format = (typeof format !== 'undefined') ? format : "png";
slice.setShouldTrim(0)
slice.setSaveForWeb(1)
slice.configureForLayer(layer)
slice.setName(layerName)
slice.setFormat(format)
doc.saveArtboardOrSlice_toFile(slice, path)
return {
x: Math.round(rect.origin.x),
y: Math.round(rect.origin.y),
width: Math.round(rect.size.width),
height: Math.round(rect.size.height)
}
}
[[layer exportOptions] addExportSize]
var exportSize = [[[[layer exportOptions] sizes] array] lastObject],
rect = [[layer absoluteRect] rect],
scale = (typeof scale !== 'undefined') ? scale : 1,
suffix = (typeof suffix !== 'undefined') ? suffix : "",
format = (typeof format !== 'undefined') ? format : "png"
exportSize.scale = scale
exportSize.name = suffix
exportSize.format = format
var slice = getSketchVersionNumber() >= 344 ? [MSSliceMaker sliceFromExportSize:exportSize layer:layer inRect:rect useIDForName:false] : [MSSliceMaker sliceFromExportSize:exportSize layer:layer inRect:rect]
[doc saveArtboardOrSlice:slice toFile: path]
[exportSize remove]
slice = nil
exportSize = nil
return {
x: Math.round(rect.origin.x),
y: Math.round(rect.origin.y),
width: Math.round(rect.size.width),
height: Math.round(rect.size.height)
}
因此 Sketch 已经取消插件的参考引用.还有有人反编译头文件
https://github.com/abynim/Sketch-Headers
可以看到 在 sketch 39上还能发现,但是 sketch 41已经取消
41的头文件
但在https://github.com/abynim/Sketch-Headers/blob/c520ba97f1d58c6cb323e8c86748dd4dbdd48d71/Headers/MSExportRequest.h 已经取消
因此Sketch 41版本,getSketchVersionNumber()= 410.
因此需要加入对这个以后版本进行处理
2.处理.查看其它版本源码.
在 Sketch Measure 有如下写法
exportImage: function(options) {
var options = this.extend(options, {
layer: this.artboard,
path: this.toJSString(NSTemporaryDirectory()),
scale: 1,
name: "preview",
suffix: "",
format: "png"
}),
document = this.document,
slice = MSExportRequest.exportRequestsFromExportableLayer(options.layer).firstObject(),
savePathName = [];
slice.scale = options.scale;
slice.format = options.format;
savePathName.push(
options.path,
"/",
options.name,
options.suffix,
".",
options.format
);
savePathName = savePathName.join("");
document.saveArtboardOrSlice_toFile(slice, savePathName);
return savePathName;
}
参考这一段代码,最终修改版本为
function exportLayerToPath(layer, path, scale, format, suffix) {
if(getSketchVersionNumber() >= 410) {
scale = (typeof scale !== 'undefined') ? scale : 1,
suffix = (typeof suffix !== 'undefined') ? suffix : "",
format = (typeof format !== 'undefined') ? format : "png"
slice = MSExportRequest.exportRequestsFromExportableLayer(layer).firstObject(),
savePathName = [];
slice.scale = scale;
slice.format = format;
doc.saveArtboardOrSlice_toFile(slice, path);
var rect = layer.absoluteRect().rect()
return {
x: Math.round(rect.origin.x),
y: Math.round(rect.origin.y),
width: Math.round(rect.size.width),
height: Math.round(rect.size.height)
}
}
if(getSketchVersionNumber() >= 350) {
var rect = layer.absoluteRect().rect(),
slice = [MSExportRequest requestWithRect:rect scale:scale],
layerName = layer.name() + ((typeof suffix !== 'undefined') ? suffix : ""),
format = (typeof format !== 'undefined') ? format : "png";
slice.setShouldTrim(0)
slice.setSaveForWeb(1)
slice.configureForLayer(layer)
slice.setName(layerName)
slice.setFormat(format)
doc.saveArtboardOrSlice_toFile(slice, path)
return {
x: Math.round(rect.origin.x),
y: Math.round(rect.origin.y),
width: Math.round(rect.size.width),
height: Math.round(rect.size.height)
}
}
[[layer exportOptions] addExportSize]
var exportSize = [[[[layer exportOptions] sizes] array] lastObject],
rect = [[layer absoluteRect] rect],
scale = (typeof scale !== 'undefined') ? scale : 1,
suffix = (typeof suffix !== 'undefined') ? suffix : "",
format = (typeof format !== 'undefined') ? format : "png"
exportSize.scale = scale
exportSize.name = suffix
exportSize.format = format
var slice = getSketchVersionNumber() >= 344 ? [MSSliceMaker sliceFromExportSize:exportSize layer:layer inRect:rect useIDForName:false] : [MSSliceMaker sliceFromExportSize:exportSize layer:layer inRect:rect]
[doc saveArtboardOrSlice:slice toFile: path]
[exportSize remove]
slice = nil
exportSize = nil
return {
x: Math.round(rect.origin.x),
y: Math.round(rect.origin.y),
width: Math.round(rect.size.width),
height: Math.round(rect.size.height)
}
}
解决问题
网友评论