2016-03-28 31 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单个呼叫配置全层,就大功告成了。