Sketch3.7之前
符號(hào)是 Sketch 3 里一個(gè)重要的新功能捐晶,有些設(shè)計(jì)師又叫它模版和屎,它功能確實(shí)像模版,你只要設(shè)計(jì)一組元素唤反,并設(shè)置為 symbol凳寺,就能方便地在多個(gè)頁面和畫板中重復(fù)運(yùn)用
該組內(nèi)容。你在某個(gè)畫板中改變symbol某個(gè)元素的彤侍,其他各畫板肠缨、頁面的同組對(duì)應(yīng)元素都會(huì)跟著改變。
符號(hào)其實(shí)就是一種特殊的組
盏阶,在圖層列表中也是以組的形式出現(xiàn)晒奕,但是不同于普通的組的藍(lán)色
圖標(biāo),符號(hào)會(huì)有一個(gè)紫色
的文件夾圖標(biāo)名斟。
如何判斷對(duì)象是否被設(shè)置了符號(hào)屬性
- 在MSLayerGroup中對(duì)應(yīng)的方法
- (BOOL)isSymbol; //
- (BOOL)isActualSymbol;
- (BOOL)containsSymbols;
- (BOOL)parentOrSelfIsSymbol;
- (BOOL)canBeUsedAsSymbolDirectly;
- 在MSLayer中
- (BOOL)isSymbol;
- (BOOL)containsSymbols;
可以用下面方法去查看:紫色的組對(duì)象 (MSLayerGroup)脑慧,isSymbol 的值為1 。
var layerEnumerator = artboard.layers().array().objectEnumerator();
loopThrough(layerEnumerator, function (layer) {
log(layer);
log(layer.isSymbol());
});
function loopThrough(layerLoop, callback) {
while (layer = layerLoop.nextObject()) {
if (isLayerClass(layer, "MSLayerGroup")) {
log(layer)
log(layer.isSymbol());
log(layer.isActualSymbol());
var layers = layer.layers().array(),
layersInsideLoop = layers.objectEnumerator();
loopThrough(layersInsideLoop, callback);
// loopThrough后面引用layer,為null
} else {
callback(layer);
}
}
}
var isLayerClass = function (layer, className) {
return Boolean(layer.className() == className);
};
取消symbol屬性
- 在MSLayerGroup中對(duì)應(yīng)的方法
layer.unregisterAsSymbolIfNecessary();
Sketch 3.7 之后
前幾天升級(jí)了Sketch后砰盐,符號(hào)的皮膚變了:紫色的兩個(gè)箭頭繞成的圓
而且程序跑出來顯示這是一個(gè)叫MSSymbolInstance對(duì)象闷袒。趕緊去看看MSSymbolInstance是何許人也Sketch-Headers。接著趕緊看看MSLayerGroup的頭文件,結(jié)果發(fā)現(xiàn)它把上文那些isSymbol岩梳,unregisterAsSymbolIfNecessary與Symbols相關(guān)的方法都刪了533....囊骤。
不過我最后還是在MSSymbolInstance中找到了一個(gè)方法:
- (id)detachByReplacingWithGroup;
我就又把Symbol變成了普通的Group。
log("detachByReplacingWithGroup"+layer.detachByReplacingWithGroup());