Sketch插件开发:如何获取图层层级及判断组的父子关系
判断MSLayerGroup父子关系的实用方案
嘿,针对你在Sketch里判断组层级关系的需求,我给你整理了几个直接好用的方法,轻松搞定父子组的识别:
核心思路:借助Sketch API的层级属性
Sketch的MSLayerGroup对象自带了和层级绑定的属性与方法,我们可以直接利用这些来判断归属关系:
1. 判断直接父子关系
每个组对象都有parentGroup()方法,它会返回当前组的直接父组(如果存在的话)。比如要验证“Child1.1 Group”是不是“Child1 Group”的直接子组,代码可以这么写:
// 假设你已经获取到child1_1Group和child1Group两个MSLayerGroup实例 if child1_1Group.parentGroup() == child1Group { print("Child1.1 Group是Child1 Group的直接子组") }
2. 判断间接后代关系
如果需要识别多层嵌套的子组(比如某个组是另一个组的孙组、曾孙组),可以写个递归函数遍历父组链:
func isDescendant(of targetParent: MSLayerGroup, group: MSLayerGroup) -> Bool { guard let parent = group.parentGroup() else { // 当前组没有父组,肯定不是目标组的后代 return false } if parent == targetParent { return true } // 递归向上查找父组 return isDescendant(of: targetParent, group: parent) } // 使用示例 if isDescendant(of: child1Group, group: child1_1Group) { print("Child1.1 Group是Child1 Group的后代子组") }
3. 结合你的选中组函数优化
如果你的函数已经能返回选中的所有MSLayerGroup,可以在遍历的时候同步收集每个组的父组信息,构建一个层级映射表,方便后续快速查询:
func collectSelectedGroupsWithHierarchy() -> [MSLayerGroup: MSLayerGroup?] { var groupHierarchy = [MSLayerGroup: MSLayerGroup?]() // 假设这是你获取选中项目的逻辑 let selectedItems = NSApp.keyWindow()?.contentViewController()?.selection() for item in selectedItems { if let group = item as? MSLayerGroup { groupHierarchy[group] = group.parentGroup() } } return groupHierarchy } // 调用后快速查询父组 let hierarchyMap = collectSelectedGroupsWithHierarchy() if let parent = hierarchyMap[child1_1Group], parent == child1Group { // 执行你的业务逻辑 }
额外技巧:获取完整层级路径
如果需要展示某个组的完整层级链(比如“Root Group > Child1 Group > Child1.1 Group”),可以用递归拼接父组名称:
func getFullHierarchyPath(for group: MSLayerGroup) -> String { guard let parent = group.parentGroup() else { return group.name() } return "\(getFullHierarchyPath(for: parent)) > \(group.name())" } // 输出示例:Root Group > Child1 Group > Child1.1 Group print(getFullHierarchyPath(for: child1_1Group))
内容的提问来源于stack exchange,提问作者La_Concorde
相关产品推荐
相关产品推荐

