Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-重用渐变的最有效的代码方式?_Ios_Swift_Cagradientlayer_Gradient - Fatal编程技术网

Ios Swift-重用渐变的最有效的代码方式?

Ios Swift-重用渐变的最有效的代码方式?,ios,swift,cagradientlayer,gradient,Ios,Swift,Cagradientlayer,Gradient,我的UI需要大约7-10种不同的渐变 我有如下设置的第一个(默认)渐变: let gradientLayer = CAGradientLayer() 在我看来: gradientLayer.frame = self.view.bounds gradientLayer.colors = [lightBlue, lightPurple] gradientLayer.locations = [0.0, 1.0] gradientLayer.zPosition = -1 self.view.layer

我的UI需要大约7-10种不同的渐变

我有如下设置的第一个(默认)渐变:

let gradientLayer = CAGradientLayer()
在我看来:

gradientLayer.frame = self.view.bounds
gradientLayer.colors = [lightBlue, lightPurple]
gradientLayer.locations = [0.0, 1.0]
gradientLayer.zPosition = -1
self.view.layer.addSublayer(gradientLayer)
gradientLayer是默认的渐变。假设我想定义: 渐变色差色调/渐变色差两个/渐变色差三个(等) 但所有这些新渐变都将具有与gradientLayer相同的精确帧/位置/zPosition

如何编写代码,使这些新渐变继承这些属性?这将使代码更加精简,并且在将来易于修改


谢谢

您可以创建一个
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()

只需为每个渐变创建一个类似的函数。

您可以创建一个
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()

只需为每个渐变创建一个类似的函数。

事实上,我看不出继承会带来什么。只需将帧、位置和zPosition的设置封装到一个方法中:

extension CAGradientLayer {
    func configure(view:UIView) {
        self.frame = view.bounds
        self.locations = [0.0, 1.0]
        self.zPosition = -1
    }
}
现在您只需调用
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
的一次调用就可以配置整个层,您就完成了。

实际上,我看不出继承会带来什么好处。只需将帧、位置和zPosition的设置封装到一个方法中:

extension CAGradientLayer {
    func configure(view:UIView) {
        self.frame = view.bounds
        self.locations = [0.0, 1.0]
        self.zPosition = -1
    }
}
现在您只需调用
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
即可配置整个层,您就完成了。

感谢您的回复。“为每个梯度创建一个类似的函数。”-这是我希望避免的部分。frame/locations/zPosition属性永远不会改变,所以我不需要重写这10次。这有意义吗?非常有效!!谢谢谢谢你的回复。“为每个梯度创建一个类似的函数。”-这是我希望避免的部分。frame/locations/zPosition属性永远不会改变,所以我不需要重写这10次。这有意义吗?非常有效!!谢谢