Убедитесь, что вы устанавливаете рамку градиента после . Авторазметка установила размер кнопки.
Если вы создаете подкласс для кнопки, вы можете сделать так что в 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)
}
}
Результат: