Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 在iPhone中标记CALayers_Search_Calayer - Fatal编程技术网

Search 在iPhone中标记CALayers

Search 在iPhone中标记CALayers,search,calayer,Search,Calayer,我正在寻找一种通用方法,可以在层次结构中搜索唯一的CALayer,而不必记住层在层次结构中的位置(并使用sublayer:和superlayer:方法) 我知道这在UIViews中是可能的(这使得翻转视图变得很容易),但是对于CALayer有可能吗 提前感谢您的帮助 佩曼道歉。我是个笨蛋。CALayer是一个兼容键值编码的容器,因此我可以在任何实例中创建任意值(包括标记)。例如,要创建标记,我们需要执行以下操作: [rootLayer setValue:[NSNumber numberWithI

我正在寻找一种通用方法,可以在层次结构中搜索唯一的CALayer,而不必记住层在层次结构中的位置(并使用sublayer:和superlayer:方法)

我知道这在UIViews中是可能的(这使得翻转视图变得很容易),但是对于CALayer有可能吗

提前感谢您的帮助


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

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

谢谢

您也可以使用CALayer的name属性

[layer setName:@"myKey"];
要查找它

- (CALayer *)myLayer {

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

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

    return nil;
}

在斯威夫特你可以做到这一点

let layer = CAShapeLayer()
layer.name = "\(index)"
for item in self.layer.sublayers! {
    if item.name == "\(index)" {
        item.removeFromSuperlayer()
        item.removeAllAnimations()
    }
}
然后,要获得图层,您可以这样做

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

这是一个现代的保险柜

为图层指定名称:

layer.name = "MyLayer"
然后,过滤搜索名称的所有子层:

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

首先,您需要命名您的CALayer

    let shadowLayer = CALayer()
    shadowLayer.name = "myname"
之后,您只需按名称进行搜索:

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

    guard let neuBlackLayer = layer.sublayers?.first(where: { $0.name == "myname" }) else { return }
    // do something with your layer
添加此答案以澄清其他人的答案:

  • 很明显,不需要过滤或循环
  • 它完成了问题中提出的功能:找到唯一层的方法(没有任何关于从超层中删除它的内容,等等)
  • 它是使用Swift 5.1编写的

  • 嗯,除了把他们都带走,没办法按名字来弄到一层?啊,好吧,总比什么都没有好!我想我可以用一处房产来避免不得不这样做。不过,如果能有办法查一下,那就太好了。很好的解决方案!我想你可以用
    $0.name==“MyLayer”
    替换返回层中的
    层。谢谢@koen,这肯定是有效的,但有时我更喜欢用$0来清晰地命名它。然而,这两种方法都可以很好地工作&归结为开发人员首选项/强制样式(如果适用),现在在循环中使用where子句比在self.layer.sublayers中使用if语句:
    更为惯用!其中item.name==“\(索引)”
    。也许最好不要使用强制展开,但这更主观。