2016-03-28 81 views
0

我的用戶界面需要大約7-10個不同的漸變。Swift - 大多數代碼高效的重用漸變方法?

我的第一個(默認)梯度設置如下:

let gradientLayer = CAGradientLayer() 

在我viewDidLoad中:

gradientLayer.frame = self.view.bounds 
gradientLayer.colors = [lightBlue, lightPurple] 
gradientLayer.locations = [0.0, 1.0] 
gradientLayer.zPosition = -1 
self.view.layer.addSublayer(gradientLayer) 

gradientLayer是默認的漸變。所以我們假設我想定義: gradientVariantOne/gradientVariantTwo/gradientVariantThree(etc.) 但所有這些新的漸變將具有精確的frame/locations/zPosition作爲gradientLayer。

如何編寫我的代碼,以便這些新梯度繼承這些屬性?這將使代碼更加精簡,並且容易在未來進行修改。

謝謝

回答

2

您可以創建一個UIView延伸,並通過調用的方法添加梯度。

extension UIView { 
    private func prepareGradient() -> CAGradientLayer { 
     let gradientLayer = CAGradientLayer() 
     gradientLayer.frame = self.bounds 
     //add all common setup here 
     return gradientLayer 
    } 

    func addGradientVariantOne() { 
     let gradientLayer = prepareGradient() 
     gradientLayer.colors = [lightBlue, lightPurple] 
     gradientLayer.locations = [0.0, 1.0] 
     gradientLayer.zPosition = -1 
     self.layer.addSublayer(gradientLayer) 
    } 
} 

然後,您只需撥打:

self.view.addGradientVariantOne() 

只需創建一個類似的功能,爲每個梯度。

+0

感謝您的回覆。 「只需爲每個漸變創建一個類似的功能。」 - 這是我希望避免的部分。 frame/locations/zPosition屬性永遠不會改變,所以我不得不重寫這10次。那有意義嗎? – Joe

+0

我更新了我的答案 – Jelly

+0

完美地工作!謝謝! – Joe

2

其實我沒有看到繼承在這裏獲得了什麼。只是封裝框架,位置和z向位置設置成一個方法:

extension CAGradientLayer { 
    func configure(view:UIView) { 
     self.frame = view.bounds 
     self.locations = [0.0, 1.0] 
     self.zPosition = -1 
    } 
} 

現在你可以叫configure讓每個梯度層的配置啓動。你甚至可以添加更多的參數,以configure(如顏色陣列),把整個事情變成一個班輪:

extension CAGradientLayer { 
    func configure(view:UIView, colors:[CGColor]) { 
     self.frame = view.bounds 
     self.locations = [0.0, 1.0] 
     self.zPosition = -1 
     self.colors = colors 
    } 
} 

因此,要configure單個呼叫配置全層,就大功告成了。