sketch插件开发探索之旅(一)

前言

===================这段废话可略过。===================
作为UI工程师,刚接触sketch不久,在工作过程中会发现有些功能用起来比较繁琐,而又找不到适合的插件来解决,所以就想要自己来写插件解决UI开发过程的问题。然而看了下官方文档很是懵逼,全英文无中文文档倒是其次,很多东西文档根本木有写全!!!网上的其他开发者写的相关文章也寥寥无几,所以我只好一边阅读现有的官方文档一边看别人的源码,大胆猜测大胆实践其中的方法属性,就此展开漫漫长路的探索之旅。
===================废话结束。。。。===================

一、cocoascript

sketch的插件本质就是一堆命令的合集,文件后缀为.sketchplugin,主要用cocoascript来写。
cocoascript是javascript和objective-c间的一个桥梁,我们在使用js的语法写插件的时候,能够调用oc的一些方法,使得我们的开发更为简便。
具体怎么调用呢,我们来分别看一下oc和cocoascript的写法。
oc:

NSString * value = [command valueForKey:kAutoresizingMask onLayer:currentLayer];

cocoascript:

var value = command.valueForKey_onLayer(kAutoresizingMask, currentLayer);

二、sketch插件的结构

mrwalker.sketchplugin 
  Contents/
     Sketch/ 
        manifest.json 
        shared.js 
        Circles.cocoascript 
        Rectangles.cocoascript 
     Resources/ 
        Screenshot.png 
        Icon.png

manifest.json

主要包含插件的配置信息,比如插件的功能、快捷键、处理命令函数、插件名称、作者名称等,告诉sketch每个命令对应由哪一个函数进行处理。

{ 
"name": "Select Shapes", 
"description": "Plugins to select and deselect shapes",
"author": "Joe Bloggs",
"homepage": "http://github.com/example/sketchplugins", 
"version": 1.0, 
"identifier": "com.example.sketch.shape-plugins",
"updateURL": "https://github.com/downloads/example/sketchplugins/sketchplugins.json",
"compatibleVersion": 3,
"bundleVersion": 1,
"commands": [ 
{
 "name": "All",
 "identifier": "all",
 "shortcut": "ctrl shift a",
 "script": "shared.js", 
"handler": "selectAll" 
},
{ 
"name": "Circles",
"identifier": "circles",
"script": "Select Circles.cocoascript"
}
],
"menu": { 
"items": [ "all", "circles", "rectangles" ] 
}}

下面解释下这些分别代表什么

commands

插件命令的合集

name

命令的名称

shortcut

命令的快捷键

handler

命令调用的处理函数,若没指定则默认为onRun函数

script

命令对应的处理文件

menu

包含插件显示的菜单

三、常用的类

我们插件处理图层、文字等等时,实际操作的就是类似下面这样一坨东西。

"<MSLayerGroup: 0x6180001d3b00> Group (741958C5-E1CE-468F-9AB2-E853C0799423)",
"<MSShapeGroup: 0x7f82e052de30> Control Center Grabber (936460F8-5773-4F47-89C2-C4BD246C63EC)",
"<MSTextLayer: 0x7f82e052df40> Date (9BE84955-A291-431D-8771-C36D51743FDD)",
"<MSLayerGroup: 0x6180001d3ce0> Charge (6F95F078-56BC-4FDA-A319-DE0FF8C50E13)",
"<MSShapeGroup: 0x7f82e052e1c0> Notification Center Grabber (75CA34DC-7FA7-4D5B-96AB-922C23F74DC5)",

我刚开始看到的时候也是一脸懵逼……那么这堆MS开头的东东到底代表什么呢。

MSDocument

代表文档对象,列举其中一些方法和属性:
1.close:,关闭文档。
2.currentPage:以及 setCurrentPage:(MSPage)page,用来获取当前页面(page)或设置页面,返回的是一个MSPage对象。
3.export:,导出。
4.showMessage:(NSString)message,在画布底部显示一些信息。
5.children,返回一个数组,包含当前page所有图层和切片。
6.addLayer:(MSLayer)layer,添加图层到该文档。
……

MSLayer

最基本的对象,代表图层。列举其中一些方法和属性:
1.frame:,只读,返回该图层的大小及在画布上的位置。
2.style:,只读,返回该图层的样式属性,如边框、阴影等。
3.name:,setName:(NSString)name。表示图层的名称以及设置图层的名称。
4.isVisible:,setIsVisible:(BOOL)value。表示图层是否可见以及设置图层是否可见。
5.parentGroup:,返回父元素。
6.isSelected :,看是否被选中,选中为true否则为false。
7.absoluteRect:,返回该图层的绝对坐标定位范围。
……

MSLayerGroup

图层组,实际也是一个MSLayer对象。列举其中一些方法和属性:
1.addLayers:(NSArray)layers,添加一个层到这个组。
2.removeLayer:,从这个组删除一个图层。
……

MSSliceLayer

表示切片。
想了解更多类请移步:
http://developer.sketchapp.com/reference/class/AppController/

四、context

命令调用对应函数时,会给函数传入一个context对象,context包含一些我们会用到的对象。

document

当前文档,MSDocument对象。

command

可用来访问当前命令。

selection

当前被选中的MSLayer。

五、运行与debuge

直接运行插件,通过console.app的过滤日志筛选插件名来查看。

六、一些实践

先举一些小例子,后续的文章还会讲到实践中的一些方法属性以及写法。
1.导出切片:

var doc = context.document//当前文档
var slice = doc.currentPage().slices().firstObject();//选择当前page的切片的第一个
doc.saveArtboardOrSlice_toFile(slice,"~/desktop/test.png");//导出切片

2.放大选中图层:

var selection = context.selection;
var layer = selection.firstObject();
if(layer) { 
//图层的中心点
 var midX=layer.frame().midX();
 var midY=layer.frame().midY();
 // 放大两倍
 layer.multiplyBy(2.0);
 // 把图层移到原来的中心点
 layer.frame().midX = midX;
 layer.frame().midY = midY;
}

3.迭代对选中的图层进行处理

var selection = context.selection;
var layer = null;
//迭代选择的图层
var loopLayer = selection.objectEnumerator();
while(layer = loopLayer.nextObject()){
      exportImage(layer);//处理图层
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容