【问题标题】:Swift - Most code-efficient way to reuse gradients?Swift - 重用渐变的代码效率最高的方法?
【发布时间】:2016-03-28 16:54:52
【问题描述】:

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

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

let gradientLayer = CAGradientLayer()

在我看来DidLoad:

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(等) 但是所有这些新的渐变都将具有精确的帧/位置/zPosition作为gradientLayer。

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

谢谢

【问题讨论】:

    标签: ios swift cagradientlayer gradient


    【解决方案1】:

    实际上,我在这里看不到通过继承获得了什么。只需将框架、位置和zPosition的设置封装到一个方法中即可:

    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 的一次调用即可配置整个层,您就完成了。

    【讨论】:

      【解决方案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()
      

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

      【讨论】:

      • 感谢您的回复。 “只需为每个渐变创建一个类似的函数。” - 这是我希望避免的部分。 frame / locations / zPosition 属性永远不会改变,所以对我来说必须重写这 10 次没有多大意义。这有意义吗?
      • 完美运行!!谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2017-04-21
      相关资源
      最近更新 更多