我在swift中有一个简单的应用程序。它有一个返回CALayer的函数,它是一个具有渐变背景的图层。
单击按钮时,我使用以下代码:
view.layer.insertSublayer(myGradientLayer, at: 0)
哪个工作正常并且绘制得很好。但是,如果我后来想通过单击第二个按钮来更改颜色,我就不能再在索引0处更改图层的颜色。如果我使用相同的代码则没有任何反应。我错过了什么?是的,我称之为view.setNeedsDisplay()
答案 0 :(得分:4)
来自文档The sublayers are listed in back to front order.
,因此每次在索引0处添加图层时,它都将低于您之前的图层。第一层可以和你一起使用,因为它是唯一的一个层,但是你在第一层之后放在索引0的任何层
答案 1 :(得分:2)
这里的答案都是正确的。非常感谢。
答案是:
view.layer.sublayers?[0].removeFromSuperLayer()
view.layer.insertSubLayer(MyLayer, at: 0)
view.setNeedsDisplay()
所以我需要在init方法中添加一个图层,就像我在实际调用上述方法之前所提出的答案之一。
答案 2 :(得分:1)
我会尽可能地命名子层myLayer.name = "myLayer"
,然后具有在替换另一层之前调用的功能。
_ = layer.sublayers?.map {
if $0.name == "myLayer" {
$0.removeFromSuperlayer()
}
}
layer.insertSublayer(myLayer, at: 0)
答案 3 :(得分:0)
当我需要类似的功能时遇到这个问题。
我的最终解决方案是定义一个继承MyCALayer
CALayer
class MyCALayer : CALayer {
var tag:Int?
override init() {
super.init()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
然后在创建图层时,为其指定标记。下次当您需要更换它时,您可以循环所有视图的子图层,并找到之前添加的相应图层。
if let sublayers = view.layer.sublayers {
for layer in sublayers {
if let mylayer = layer as? MyCALayer,
mylayer.tag == tag {
mylayer.removeFromSuperlayer()
}
}
}
分享以防其他人遇到类似问题。
答案 4 :(得分:0)
还有一种replaceSublayer(_ oldLayer: CALayer, with newLayer: CALayer)
方法:
view.layer.replaceSublayer(theOldLayer, with: newLayer)
上面的代码用新视图替换了旧视图。