2016-09-26 28 views
0

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

当按钮被点击我使用此代码:

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

的正常工作,并提请正常。但是,如果我稍后想通过单击第二个按钮来更改颜色,我不能再更改索引0处图层的颜色。如果我使用相同的代码,则不会发生任何操作。我错过了什么?是的,我从文档The sublayers are listed in back to front order.调用view.setNeedsDisplay()

+1

是的,因为你的上一层将在上面... 如何?以及有很多选项来解决这个问题... Wha即将CALayer作为一个成员,并将其着色,而只插入一次在init或什么? – ColdSteel

回答

3

,因此每次在索引0处添加图层时,它都会低于前一个图层。第一层与您一起工作,因为它是唯一的图层,但是您在索引0处放置的任何图层在其位于第一个图层下方之后将被放置

0

这两个答案都是正确的。非常感激。

答案是:

view.layer.sublayers?[0].removeFromSuperLayer() 
view.layer.insertSubLayer(MyLayer, at: 0) 
view.setNeedsDisplay() 

所以我需要在init方法中添加了一层像一个答案建议之前,我实际上可以调用上面的方法。

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() 
      } 
     } 
    } 

分享它以防其他人有类似问题。

相关问题