美文网首页
Sketch 插件 bug 修复

Sketch 插件 bug 修复

作者: 蓝点工坊 | 来源:发表于2017-02-14 21:48 被阅读833次

我写一个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已经取消

39的头文件
https://github.com/abynim/Sketch-Headers/blob/2b88a93f8749d7120a08cbe9d48f0b695d447a08/Headers/MSExportRequest.h

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)
    }
}

解决问题

相关文章

网友评论

      本文标题:Sketch 插件 bug 修复

      本文链接:https://www.haomeiwen.com/subject/oqdfwttx.html