在iPhone中标记CALayers

时间:2010-05-17 23:11:17

标签: search calayer

我正在寻找能够在层次结构中搜索唯一CALayer的一般方法,而不必记住层在层次结构中的位置(并使用sublayer:和superlayer:methods)。

我知道UIViews可以实现这一点(这使得查看视图变得容易)但是CALayer可以吗?

提前感谢您的帮助

Peyman的

5 个答案:

答案 0 :(得分:56)

您还可以使用CALayer的name属性。

[layer setName:@"myKey"];

要查找,

- (CALayer *)myLayer {

    for (CALayer *layer in [superLayerOfMyLayer sublayers]) {

            if ([[layer name] isEqualToString:LabelLayerName]) {
                return layer;
            }
    }

    return nil;
}

答案 1 :(得分:23)

道歉。我是个笨蛋。 CALayer是一个符合键值编码的容器,因此我可以在任何实例中创建任意值(包括标签)。例如,要创建标记,我们执行以下操作:

[rootLayer setValue:[NSNumber numberWithInt:101] forKey:@"PFtag"];

谢谢

答案 2 :(得分:5)

在Swift中你可以做到这一点

for item in self.layer.sublayers! {
    if item.name == "\(index)" {
        item.removeFromSuperlayer()
        item.removeAllAnimations()
    }
}

然后获取图层可以执行此操作

{{1}}

答案 3 :(得分:1)

对此事采取现代安全措施。

为图层分配名称:

layer.name = "MyLayer"

然后,过滤所有子层以搜索名称:

layer.sublayers?
    .filter { layer in return layer.name == "MyLayer" }
    .forEach { layer in
        layer.removeFromSuperlayer()
        layer.removeAllAnimations()
}

答案 4 :(得分:1)

首先,您需要命名 CALayer

    let shadowLayer = CALayer()
    shadowLayer.name = "myname"

之后,您只需按名称进行搜索:

    if let neuBlackLayer = layer.sublayers?.first(where: { $0.name == "myname" }) {
       // do something with your layer
    }

与警卫相同:

    guard let neuBlackLayer = layer.sublayers?.first(where: { $0.name == "myname" }) else { return }
    // do something with your layer

添加了此答案以澄清其他人的答案:

  1. 很明显,不需要过滤或循环。
  2. 它确实解决了所要问的问题:找到唯一层的方式(与从超级层中删除它无关,等等)
  3. 它是使用 Swift 5.1
  4. 编写的