2016-11-03 2 views
3

Я пытаюсь добавить подслой на моем UIImageView, но он не работает.Добавить градиент на UIImageView

  • У меня есть набор из 10 изображений, именованных от photo0 до photo9 и отобразить его с таймером 5 сек.
  • Выход shanghaiImage мой фон

Я хотел бы добавить градиент поверх этого Marty, как: прозрачный (сверху) до черного (внизу).

Спасибо за помощь :)

Вот мой код в Swift 3.

Эта часть прекрасно:

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) 
} 

Именно здесь, где есть проблема. Я не знаю, почему он не работает.

// 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. 
} 
} 
+0

«Здесь, где есть проблема». Но вы не сказали, в чем проблема _is_. – matt

+0

О, да, напишите, жуйте, на самом деле у меня есть изображения, которые меняются каждые 5 секунд; но эффект градиента на моем UIimageView не «работает», у меня нет тени или чего-то поверх моих изображений :) – Alexandre

+0

@Alexandre Вы сохранили это изображение в галерее i-Phone? –

ответ

7

Я хотел бы предложить положить UIView с градиентом сверху 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) 

Objective-C:

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]; 
+0

@DeepakKumar Я обновил свой ответ, чтобы иметь объектив-c в нем. Мой Obj-C немного ржавый, и Xcode сейчас не работает, поэтому у него могут быть некоторые ошибки. –

+0

@CalebKleveter Я использовал этот код, но теперь хочу сохранить это изображение в своей галерее, как мне это достичь? –

+0

@KhushbuDesai Если вы хотите сохранить изображение, в которое вы добавили градиент, оно будет гораздо более привлекательным, потому что вам нужно будет отредактировать фактическое изображение. Я бы предложил Googling, чтобы попытаться найти что-то. –

7

Вы можете использовать расширение для скор 3 и быстры 4

Создайте новый файл для расширения UIImageView, как UIImageView_extension.swift и установить в этом коде:

import UIKit 

extension UIImageView{ 
    func addBlackGradientLayer(frame: CGRect, colors:[UIColor]){ 
    let gradient = CAGradientLayer() 
    gradient.frame = frame 
    gradient.colors = colors.map{$0.cgColor} 
    self.layer.addSublayer(gradient) 
    } 
} 

и в вашем ViewController.swift вы можете использовать:

class myViewController: UIViewController{ 
    @IBOutlet weak var imageView: UIImageView! 

    override func viewDidLoad() { 
    super.viewDidLoad() 

     imageView.addBlackGradientLayer(frame: view.bounds, colors:[.clear, .black]) 
     //Alternative 
     //imageView.addBlackGradientLayer(frame: imageView.frame, colors: [.clear, .black]) 
    } 
} 

Эта функция нуждается в рамку , так что вам нужен только кадр из представления или самостоятельно imageView. Всегда думайте, как универсальная функция, тогда вы можете изменить цвета градиента без проблем в будущем в других представлениях.

+1

Поскольку это расширение для 'UIImageView' вместо добавления рамки параметра, вы можете использовать свойство' self.frame'. Код должен выглядеть примерно так: 'gradient.frame = self.frame'. В любом случае, спасибо за решение, оно действительно работает! – Bogdan

+1

Эй, я пробовал это, хорошо работает. Единственное, с чем мне приходится сталкиваться, это то, что градиент не полностью покрывает мое изображение. Он оставляет немного изображения с правой стороны. –

+0

Я согласен с @ eraser2021999, строка, определяющая рамку, может быть gradient.frame = self.frame вместо этого, и метод не должен иметь никакого параметра. – Iris

Смежные вопросы