如何更换当前的CALayer

时间:2016-09-26 14:59:01

标签: ios objective-c swift macos

我在swift中有一个简单的应用程序。它有一个返回CALayer的函数,它是一个具有渐变背景的图层。

单击按钮时,我使用以下代码:

view.layer.insertSublayer(myGradientLayer, at: 0)

哪个工作正常并且绘制得很好。但是,如果我后来想通过单击第二个按钮来更改颜色,我就不能再在索引0处更改图层的颜色。如果我使用相同的代码则没有任何反应。我错过了什么?是的,我称之为view.setNeedsDisplay()

5 个答案:

答案 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)

上面的代码用新视图替换了旧视图。