美团积木Sketch插件进阶开发指南( 九 )
替换文本
基于class-dump , 我们可以找出Sketch中声明的所有类的属性和方法 , 文本处理的策略是 , 找到图层中的所有MSAvailableOverride对象 , 这些对象即表示可用的覆盖项 , 对文本信息的修改实际上是通过修改MSAvailableOverride对象的overridePoint来实现的 。
id overridePoint = [availableOverride valueForKeyPath:@''overridePoint'']; [symbolInstance setValue:text forOverridePoint:overridePoint];更改样式
样式设置的策略 , 是找到当前选中组件对应的Library中相关样式的组件 。 由于所有的组件都遵循统一的命名格式 , 因此只要根据组件命名就能筛选出符合要求的组件 。
// 命名方式:一级分类/二级分类/组件名称 , 基于图层获取对应library id library = [self getLibraryBySymbol:layer]; // 读取组件名称 NSString *layerName = [symbol valueForKeyPath:@''name'']; // 配置符合当前业务的Predicate NSPredicate *predicate = [NSPredicate predicateWithFormat:@''name BEGINSWITH [cd] %@'', prefix]; // 筛选符合Predicate的所有组件 NSArray *filterResult = [allSybmols filteredArrayUsingPredicate:predicate];当使用者选中某一个样式后 , 插件会将设计稿上的组件替换为选中的组件 , 这里需要使用MSSymbolInstance中的changeInstanceToSymbol方法来实现 。 需要注意的是 , changeInstanceToSymbol仅仅替换了图层中的组件 , 但是并没有修改图层上组件的属性 , 对于位置和大小等信息需要单独进行处理 。
// 在更新图层上的组件之前 , 我们需要把组件导入到当前document对象中 id foreignSymbol = [libraryController importShareableObjectReference:sharedObject intoDocument:documentData]; //更新图层上的组件 [symbolInstance changeInstanceToSymbol:localSymbol];调试技巧
OC侧开发的最大问题 , 在于没有官方API的支持 。 因此调试器就显得非常重要 , 单步调试可以让我们非常方便地深入到Sketch内部了解Document内部的数据结构 。 调试环境需要配置 , 但足够简单 , 并且对于开发效率的提升是指数级的 。
1. 对构建Scheme的配置 。
本文插图
2. Attach到Sketch软件上 , 这样就可以实现断点调试 。
本文插图
与当前JS工程混合编译
1. 通过skpm中内置的@skpm/xcodeproj-loader编译XCode工程 , 并将产物framework拷贝至插件文件夹 。
const framework = require('../../RooSketchPluginXCodeProject/RooSketchPluginXCodeProject.xcworkspace/contents.xcworkspacedata');2. 通过Mocha提供的loadFrameworkWithName_inDirectory方法 , 设置Framework的名称及路径即可进行加载 。
function() { var mocha = Mocha.sharedRuntime(); var frameworkName = 'RooSketchPluginXCodeProject'; var directory = frameworkPath; if (mocha.valueForKey(frameworkName)) { console.info('JSloadFramework: `' + frameworkName + '` has loaded.'); return true; } else if (mocha.loadFrameworkWithName_inDirectory(frameworkName, directory)) { console.info('JSloadFramework: `' + frameworkName + '` success!'); mocha.setValue_forKey_(true, frameworkName); return true; } else { console.error('JSloadFramework load failed'); return false; } }3. 调用framework中的方法
// 找到已经被加载的framework const frameworkClass = NSClassFromString('RooSketchPluginNativeUI'); // 调用暴露的方法 frameworkClass.onSelectionChanged(context);一起拼积木
推荐阅读
- 影驰|独特积木外观!影驰GAMER RGB DDR5-5600 8Gx2内存图赏
- 美团|屈臣氏主播辱骂消费者、1分钱面膜不发货!美团客服回应来了
- 外卖员|投入500万配送补贴!美团外卖:免除所有西安骑手违规扣罚
- 指纹识别|美团公开新专利:指纹解锁共享单车 不用扫码了
- 支付宝|比支付宝、微信更高级!美团外卖开通数字人民币支付通道
- 坦克|当歼20、运20、东风导弹、99A坦克变成积木:细节控舒服了
- 积木|小米有品众筹祝融号火星车:1:7等比缩放 支持遥控
- 红包|美团外卖崩了官方道歉:为受影响的用户提供10元无门槛红包
- 崩溃|美团外卖崩了 美团众包APP:系统网络异常已恢复 骑手可正常配送
- 美团外卖|美团外卖崩了 大批网友早饭泡汤 官方:紧急修复后骑手将第一时间配送
