美文网首页
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