如何在Swift中以编程方式在图像上添加渐变层?

时间:2015-04-14 16:58:24

标签: ios iphone xcode swift ios8

我想在UIImage上放置一个预定义 透明到黑色 渐变的图层,其内容图片是通过网络加载的 在它上面创造阴影的效果。

我不想通过加载具有这种渐变的png来实现。

1 个答案:

答案 0 :(得分:12)

我建议创建UIView的自定义子类(或UIImageView,如果要添加渐变的是UIImageView)。在自定义视图的init方法中,创建一个CAGradientLayer并将其添加为视图图层的子图层。然后在图层上设置黑色到透明渐变。

您可能需要覆盖layoutSubviews()并更改渐变图层上的设置,以防视图边界发生变化。

编辑:

我创建了一个playground as a gist on github,这是一个有效的例子:

代码如下所示:

import UIKit
import AVFoundation


class ImageViewWithGradient: UIImageView
{
  let myGradientLayer: CAGradientLayer

  override init(frame: CGRect)
  {
    myGradientLayer = CAGradientLayer()
    super.init(frame: frame)
    self.setup()
  }

  required init(coder aDecoder: NSCoder)
  {
    myGradientLayer = CAGradientLayer()
    super.init(coder: aDecoder)
    self.setup()
  }

  func setup()
  {
    myGradientLayer.startPoint = CGPoint(x: 0, y: 0)
    myGradientLayer.endPoint = CGPoint(x: 1, y: 1)
    let colors: [CGColorRef] = [
      UIColor.clearColor().CGColor,
      UIColor(red: 0, green: 0, blue: 0, alpha: 0.3).CGColor,
      UIColor(red: 1, green: 1, blue: 1, alpha: 0.5).CGColor,
      UIColor(red: 0, green: 0, blue: 0, alpha: 0.3).CGColor,
      UIColor.clearColor().CGColor ]
    myGradientLayer.colors = colors
    myGradientLayer.opaque = false
    myGradientLayer.locations = [0.0,  0.3, 0.5, 0.7, 1.0]
    self.layer.addSublayer(myGradientLayer)
  }

  override func layoutSubviews()
  {
    myGradientLayer.frame = self.layer.bounds
  }
}


var aView = ImageViewWithGradient(frame: CGRect(x: 0, y: 0, width: 500, height: 500))