2016-09-26 30 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() 
      } 
     } 
    } 

分享它以防其他人有類似問題。

相關問題