Как установить фон UIButton на CAGradientLayer?
Я пробовал следующее:
func applyGradient(colors: [UIColor], locations: [NSNumber]?) -> Void {
let gradient: CAGradientLayer = CAGradientLayer()
gradient.frame = self.bounds
gradient.colors = colors.map { $0.cgColor }
gradient.locations = locations
self.layer.insertSublayer(gradient, at: 0)
}
который я получил от Установить градиент фона на кнопке в Swift
а затем использовать его:
let startButton: UIButton = {
let button = UIButton(type: .system)
button.setTitle("Get Started", for: .normal)
button.setTitleColor(AppSettings.PURPL_COLOR, for: .normal)
button.titleLabel?.font = UIFont(name: "Rubik-Medium", size: 16.0)
return button
}()
startButton.applyGradient(colors: [.red, .blue], locations: nil)
Кроме того, я устанавливаю ширину кнопки на ширину представления и высоту на 50.
Однако, когда я запускаю его, я получаю следующее:
Градиент фона не применяется.
Bounds
кнопки будет равно 0 при вызове метода applyGradient
. Итак, создайте подкласс UIButton и измените слой градиента frame
в методе layoutSublayers
.
class GradientButton: UIButton {
let gradient: CAGradientLayer = CAGradientLayer()
internal override init(frame: CGRect) {
super.init(frame: frame)
}
internal required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
required init(_ colors: [UIColor], locations: [NSNumber]?) {
super.init(frame: .zero)
applyGradient(colors,locations:locations)
}
func applyGradient(_ colors: [UIColor], locations: [NSNumber]?) {
gradient.colors = colors
gradient.locations = locations
gradient.startPoint = CGPoint(x: 0.0, y: 1.0)
gradient.endPoint = CGPoint(x: 1.0, y: 1.0)
layer.insertSublayer(gradient, at: 0)
}
override func layoutSublayers(of layer: CALayer) {
super.layoutSublayers(of: layer)
gradient.frame = self.bounds
}
}
И создайте кнопку со значениями цвета и местоположения
let button = GradientButton([.red,.blue], locations: nil)
@ Омар Хашим Да. Звоните startButton.applyGradient(colors: [.red, .blue], locations: nil)
в viewDidLayoutSubviews
@OmarSinan Но метод viewDidLayoutSubviews
вызывается несколько раз в контроллере представления. Каждый раз, когда вы вызываете метод applyGradient
, он добавляет новый слой. Рассмотрите возможность использования подкласса UIButton
или сохраните ссылку на gradientLayer
О, точно я не подумал об этом. Спасибо за внимание!
Спасибо за это, я бы предпочел использовать только UIButton. Будет ли применение градиента в viewDidLayoutSubviews подходящим?