Реализация тени на объекте из моих предопределенных теней в Sketch - PullRequest
1 голос
/ 16 января 2020

Я не профессионал в javascript, но я хочу реализовать тень на объекте из моих предопределенных теней, но код не работает:

      var selection = context.selection;
      for (var i=0; i < selection.count(); i++){
        var layer = selection.objectAtIndex(i)

           if (layer.isEmpty) UI.message('No layers selected!');
           else {
                var sha_0 = [];
                var sha_1 = [
                color: '#00000024',
                 x: 0,
                 y: 1,
                 blur: 1,
                 spread: 0
                ]
                var sha_2 = [
                color: '#00036024',
                 x: 0,
                 y: 1,
                 blur: 1,
                 spread: 0
                ]
                var options = ['0dp', '1dp', '2dp'];
                var selectDialog = sketch.UI.getSelectionFromUser("Please select shadow depth:", options);
                if (selected == 0) {
                layer.forEach(function (e) {
                   e.style.shadows = sha_0;
                 });
               } else if (selected == 1) {
                 layer.forEach(function (e) {
                   e.style.shadows = sha_1;
                 });
               } else if (selected == 2) {
                 layer.forEach(function (e) {
                   e.style.shadows = sha_2;
                 });
               }
           }
      }

1 Ответ

2 голосов
/ 19 января 2020

Методы, которые необходимо вызвать, принадлежащие к библиотеке UI, являются асинхронными. Они полагаются на то, что пользователь выполнит какое-либо действие, прежде чем код сможет продолжить работу. В Javascript это требует либо функции обратного вызова, либо использования async / await с обещаниями. Указанный вами метод c: sketch.UI.getSelectionFromUser исключен в пользу нового UI.getInputFromUser метода , как вы можете найти здесь .

Например:

UI.getInputFromUser(
  "What's your favorite design tool?",
  {
    type: UI.INPUT_TYPE.selection,
    possibleValues: ['Sketch', 'Paper'],
  },
  (err, value) => {
    if (err) {
      // most likely the user canceled the input
      return
    }
  }
)

Таким образом, ваш код будет выглядеть примерно так:

// selected layers via document object per docs
var selection = document.selectedLayers;
// iterate directly over the selection layers
selection.forEach(layer => {
  // These shadows are objects, not arrays, so changed [] to {}
  var sha_0 = [];
  var sha_1 = [{
    color: '#00000024',
    x: 0,
    y: 1,
    blur: 1,
    spread: 0
  }]
  var sha_2 = [{
    color: '#00036024',
    x: 0,
    y: 1,
    blur: 1,
    spread: 0
  }]
  var options = ['0dp', '1dp', '2dp'];
  // Use the newer getInputFromUser method
  UI.getInputFromUser(
    "Please select shadow depth:",
    {
      type: UI.INPUT_TYPE.selection,
      possibleValues: options,
    },
    (err, value) => {
      if (err) {
        // most likely the user canceled the input
        return
      }
      switch (value) {
        case options[0]:
          layer.style.shadows = sha_0;
          break;
        case options[1]:
          layer.style.shadows = sha_1;
          break;
        case options[2]:
          layer.style.shadows = sha_2;
          break;
      }
    }
  )
})

Возможно, ваш код может быть упрощен еще больше, но это должно заставить вас двигаться снова.

...