Цвет горизонтального градиента, показывающий половину только в Swift? - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь дать цвет градиента для кнопки Baground, я пытаюсь с помощью следующего кода

func setGradientBackground(colorOne: UIColor, colorTwo: UIColor) {
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = bounds
        gradientLayer.colors = [colorOne.cgColor, colorTwo.cgColor]
        gradientLayer.locations = [0.0, 1.0]
        gradientLayer.startPoint = CGPoint(x: 1.0, y: 0.0)
        gradientLayer.endPoint = CGPoint(x: 0.0, y: 1.0)
        layer.insertSublayer(gradientLayer, at: 0)
    }

@IBOutlet weak var loginbtn: UIButton!
loginbtn.setGradientBackground(colorOne: UIColor.red, colorTwo: UIColor.blue)

Я пытаюсь получить доступ к этому методу, он покажет вывод как это. Как это исправить, See output

Если я добавлю следующий код

override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        loginbtn.setGradientBackground(colorOne: UIColor.red, colorTwo: UIColor.green)
    }

, появится следующая ошибка. Image like as joint

1 Ответ

1 голос
/ 12 февраля 2020

Убедитесь, что вы устанавливаете рамку градиента после . Авторазметка установила размер кнопки.

Если вы создаете подкласс для кнопки, вы можете сделать так что в layoutSubviews().

В противном случае, хорошее место для этого в вашем контроллере представления находится в viewDidLayoutSubviews():

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    loginbtn.setGradientBackground(colorOne: UIColor.red, colorTwo: UIColor.blue)
}

Редактировать

На основании второго изображения, которое вы разместили - получение перекрывающихся градиентов при вызове из viewDidLayoutSubviews() ... Поскольку автоматическое размещение «делает свое дело», которое можно вызывать более одного раза, и вы добавление нового слоя каждый раз, когда он вызывается.

Я не знаю, что еще вы могли бы делать в своем пользовательском классе, но попробуйте вот так:

class GradButton: UIButton {

    let gradientLayer = CAGradientLayer()

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }

    func commonInit() -> Void {

        gradientLayer.locations = [0.0, 1.0]

        // top-right to bottom-left
        gradientLayer.startPoint = CGPoint(x: 1.0, y: 0.0)
        gradientLayer.endPoint = CGPoint(x: 0.0, y: 1.0)

        // we only add the layer once, here when called from init    
        layer.addSublayer(gradientLayer)

    }

    func setGradientBackground(colorOne: UIColor, colorTwo: UIColor) {
        gradientLayer.colors = [colorOne.cgColor, colorTwo.cgColor]
    }

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

}

class MyTest: UIViewController {

    @IBOutlet var loginbtn: GradButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        loginbtn.setGradientBackground(colorOne: .red, colorTwo: .yellow)
    }

}

Результат:

enter image description here

...