Градиент кнопки не работает при добавлении в viewDidLayoutSubviews - PullRequest
0 голосов
/ 25 мая 2019

Я добавляю градиент кнопки, используя приведенный ниже код

extension UIView {
    func applyGradient(colors: [UIColor]) {
        self.applyGradient(colors: colors, locations: nil)
    }

    func applyGradient(colors: [UIColor], locations: [NSNumber]?) {
        let gradient = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.colors = colors.map { $0.cgColor }
        gradient.locations = locations
        gradient.startPoint = CGPoint(x: 0, y: 0)
        gradient.endPoint = CGPoint(x: 1, y: 0)
        self.layer.insertSublayer(gradient, at: 0)
    }
}

Вызов initStyle() в viewDidLayoutSubviews() не работает.

func initStyle() {
    submitBtn.applyGradient(colors: [#colorLiteral(red: 0.1176470588, green: 0.3882352941, blue: 0.5254901961, alpha: 1), #colorLiteral(red: 0.2941176471, green: 0.9098039216, blue: 0.9529411765, alpha: 1)])
    submitBtn.layer.cornerRadius = 15.0
    submitBtn.layer.masksToBounds = true
}

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

lazy var submitBtn: UIButton = {
    let btn = UIButton(type: .system)
    btn.translatesAutoresizingMaskIntoConstraints = false
    btn.setTitle("SUBMIT", for: .normal)
    return btn
}()

Как заставить это работать?


Градиент отображается только в том случае, если я помещаю initStyle() в viewDidAppear(), а не в viewDidLayoutSubviews(), что создает задержку при отображении градиента кнопки.Я хочу избежать этой задержки.Поэтому я добавляю его в viewDidLayoutSubviews, но тогда градиент не появляется.

Ответы [ 3 ]

1 голос
/ 25 мая 2019

Я думаю, что проблема здесь в том, что self.bounds равен 0 в точке, где вы вызываете функцию градиента. Попробуйте вызвать его позже, например, viewWillAppear или вызвать view.layoutSubViews, чтобы вызвать iewDidLayoutSubviews ()

0 голосов
/ 25 мая 2019

попробуйте использовать функцию внутри viewWillAppeare ()

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

если вы хотите установить градиент с условием, вы можете использовать следующее

func displayButton(condition: Bool){


lazy var submitBtn: UIButton = {
let btn = UIButton(type: .system)
btn.translatesAutoresizingMaskIntoConstraints = false
btn.setTitle("SUBMIT", for: .normal)

if condition == true {
//set the gradient here
return btn
} else if condition == false
return btn
}

}()



override func viewDidLoad(){
super.viewDidLoad()
 //here you can set the condition to show the gradient or not depending on what you want
displayButton(true) //will show the gradient
displayButton(false) // will show without gradient

}

В данный момент я не могу проверить этот код, поэтому я не уверен в этом, попробуйте.

0 голосов
/ 25 мая 2019
lazy var submitBtn: UIButton = {
    let btn = UIButton(type: .custom) //Set custom instead of system
    btn.translatesAutoresizingMaskIntoConstraints = false
    btn.setTitle("SUBMIT", for: .normal)
    return btn
}()
...