Agregar un degradado en UIImageView

Estoy intentando agregar una subcapa en mi UIImageView pero no funciona.

  • Tengo un set de 10 imágenes nombradas de photo0 a photo9 y lo photo9 con un timer de 5s.
  • La salida shanghaiImage es mi background

Me gustaría agregar un gradiente encima de este marty como: transparente (arriba) a negro (abajo).

Gracias por la ayuda 🙂

Aquí está mi código en Swift 3.

Esta parte está bien:

 import UIKit class ViewController: UIViewController { @IBOutlet weak var shanghaiImage: UIImageView! // beginning index var _curentImageIndex:Int = 0 // number of images let NUMBER_OF_IMAGES:Int = 10 // creation of the Timer var _uiTimer:Timer? override func viewDidLoad() { super.viewDidLoad() showPhoto(atIndex: _curentImageIndex) } // MARK TIMER --------- func selectNewTimer(){ if let existingTimer:Timer = _uiTimer{ existingTimer.invalidate() } _uiTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(ViewController.showNextImage), userInfo: nil, repeats: true) } 

Es aquí donde hay un problema. No sé por qué no funciona.

 // MARK PHOTO --------- func showPhoto(atIndex index:Int){ let photoName:String = "photo\(index)" shanghaiImage.image = UIImage(named: photoName) let gradient = CAGradientLayer() gradient.frame = shanghaiImage.bounds let startColor = UIColor(colorLiteralRed: 0, green: 0, blue: 0, alpha: 1) let endColor = UIColor.black gradient.colors = [startColor, endColor] shanghaiImage.layer.insertSublayer(gradient, at: 0) _curentImageIndex = index selectNewTimer() } func showNextImage() { var nextPhotoIndex:Int = _curentImageIndex + 1 if nextPhotoIndex >= NUMBER_OF_IMAGES { nextPhotoIndex = 0 } showPhoto(atIndex: nextPhotoIndex) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

Sugeriría poner una UIView con el gradiente encima del UIImageView :

 @IBOutlet weak var shanghaiImage: UIImageView! let view = UIView(frame: profileImageView.frame) let gradient = CAGradientLayer() gradient.frame = view.frame gradient.colors = [UIColor.clear.cgColor, UIColor.black.cgColor] gradient.locations = [0.0, 1.0] view.layer.insertSublayer(gradient, at: 0) shanghaiImage.addSubview(view) shanghaiImage.bringSubview(toFront: view) 

C objective:

 UIView *view = [[UIView alloc] initWithFrame: profileImageView.frame]; CAGradientLayer *gradient = [[CAGradientLayer alloc] init]; gradient.frame = view.frame; gradient.colors = @[ (id)[[UIColor clearColor] CGColor], (id)[[UIColor blackColor] CGColor] ]; gradient.locations = @[@0.0, @1.0]; [view.layer insertSublayer: gradient atIndex: 0]; [shanghaiImage addSubview: view]; [shanghaiImage bringSubviewToFront: view]; 

Puedes usar la extensión para swift 3

Cree un file nuevo para su extensión de UIImageView como UIImageView_extension.swift y configúrelo en este código:

 import UIKit extension UIImageView{ func addBlackGradientLayer(frame: CGRect){ let gradient = CAGradientLayer() gradient.frame = frame gradient.colors = [UIColor.black.cgColor, UIColor.clear.cgColor] gradient.locations = [0.0, 0.5] self.layer.addSublayer(gradient) } } 

y en su ViewController.swift puede usarlo:

 class myViewController: UIViewController{ @IBOutlet weak var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() imageView.addBlackGradientLayer(frame:imageView.frame) } } 

Esta function necesita un marco, por lo que solo coloca el mismo marco de la image.