【发布时间】:2011-02-20 16:00:05
【问题描述】:
我正在寻找一种能够在层次结构中搜索唯一 CALayer 的通用方法,而无需记住该层在层次结构中的位置(并使用 sublayer: 和 superlayer: 方法)。
我知道 UIViews 可以做到这一点(这使得翻转视图变得容易)但是 CALayer 可以吗?
提前感谢您的帮助
佩曼
【问题讨论】:
我正在寻找一种能够在层次结构中搜索唯一 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;
}
【讨论】:
在 Swift 中你可以做到这一点
let layer = CAShapeLayer()
layer.name = "\(index)"
然后要获取图层,您可以这样做
for item in self.layer.sublayers! {
if item.name == "\(index)" {
item.removeFromSuperlayer()
item.removeAllAnimations()
}
}
【讨论】:
for item in self.layer.sublayers! where item.name == "\(index)"。也可能最好不要使用强制展开,但这更主观。
现代保险箱对此的看法。
为图层命名:
layer.name = "MyLayer"
然后,过滤所有搜索名称的子层:
layer.sublayers?
.filter { layer in return layer.name == "MyLayer" }
.forEach { layer in
layer.removeFromSuperlayer()
layer.removeAllAnimations()
}
【讨论】:
layer in return layer.name == "MyLayer" 替换为$0.name == "MyLayer"。
首先,您需要命名您的 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
添加此答案以澄清其他人的答案:
【讨论】: