2017-02-13 9 views
0

У меня есть функция класса для создания слоя CAGradient и вставка его в UIView, который отлично работает.Изменение цвета в CAGradientLayer после вставки

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

На отображаемой странице я использую ползунки, чтобы установить новые цвета в два фонового изображения UIButton и вызвать функцию ниже. Я ожидаю, что фон градиентного слоя изменится при изменении слайдера, но это не так. Я проверил, что функция вызывается, и значения цвета действительны.

Как изменить градиент при перемещении ползунков?

Вот функция класса:

class func setGradientBG(_ firstColor: CGColor, secondColor: CGColor, vertical: Bool, thisView: UIView){ 
    let gradientLayer = CAGradientLayer() 
    gradientLayer.frame = thisView.bounds 
    gradientLayer.colors = [firstColor, secondColor] 
    gradientLayer.locations = [0.0, 1.2] 
    if !vertical{ 
     gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0) 
     gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.0) 
    } 
    thisView.layer.insertSublayer(gradientLayer, at: 0) 
} 

А вот функция вызывается из ползунков:

func doSlider(){ 
    CommonFuncs.setGradientBG((self.TopColorBut.backgroundColor?.cgColor)!, secondColor: (self.BottomColorBut.backgroundColor?.cgColor)!, vertical: true, thisView: self.view) 
} 
+0

использование thisView.layer.setNeedsDisplay() – Idali

+0

Какой класс содержит это метод 'doSlider'? Сколько различных представлений вы добавляете градиенты? Почему 'setGradientBG' метод класса? –

ответ

0

Вы добавляете еще один экземпляр CAGradientLayer каждый раз, когда вы звоните setGradientBG. Вы действительно думаете, что это хорошая идея?

Похоже, что ваш метод doSlider, вероятно, является частью пользовательского подкласса UIViewController. Что вам нужно сделать, это сохранить ссылку на слой градиента в контроллере представления и обновить существующий уровень. Пример:

class ViewController: UIViewController { 

    private let gradientLayer = CAGradientLayer() 

    @IBOutlet var topColorButton: UIButton! 
    @IBOutlet var bottomColorButton: UIButton! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     view.layer.insertSublayer(gradientLayer, at: 0) 
     self.updateGradientLayer() 
    } 

    @IBAction func doSlider() { 
     updateGradientLayer() 
    } 

    private func updateGradientLayer() { 
     gradientLayer.locations = [ 0.0, 1.2 ] 
     gradientLayer.startPoint = .zero 
     gradientLayer.endPoint = CGPoint(x: 0, y: 1) 
     gradientLayer.colors = [ 
      (topColorButton.backgroundColor ?? .clear).cgColor, 
      (bottomColorButton.backgroundColor ?? .clear).cgColor ] 
    } 

    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     gradientLayer.frame = view.bounds 
    } 

} 
+0

Мне было интересно об этом - добавление нескольких слоев. Я внесу некоторые изменения в свой код, чтобы слой был добавлен в контроллер вида и только что был изменен с помощью общей функции. – wayneh

0

подслоях перечислены в задней к передней порядка. Итак, вставьте новый подуровень. Или удалите старые.

+0

Спасибо за совет, но я думаю, что у Роба есть ответ ниже. Мне нужно переписать мою функцию, чтобы я мог ссылаться на добавленный слой. – wayneh