Here is a code of @IBDesignable
Gradient View. You can use Top to Bottom and Left to Right from Storyboard
.
private var startGradientColorAssociatedKey : UIColor = .black
private var endGradientColorAssociatedKey : UIColor = .black
private var observationGradientView: NSKeyValueObservation?
extension UIView {
@IBInspectable var startGradientColor: UIColor {
get {
if let color = objc_getAssociatedObject(self, &startGradientColorAssociatedKey) as? UIColor {
return color
} else {
return .black
}
} set {
objc_setAssociatedObject(self, &startGradientColorAssociatedKey, newValue, .OBJC_ASSOCIATION_RETAIN)
}
}
@IBInspectable var endGradientColor: UIColor {
get {
if let color = objc_getAssociatedObject(self, &endGradientColorAssociatedKey) as? UIColor {
return color
} else {
return .black
}
} set {
objc_setAssociatedObject(self, &endGradientColorAssociatedKey, newValue, .OBJC_ASSOCIATION_RETAIN)
}
}
@IBInspectable
var isTopToBottomGradient: Bool {
get {
return self.isTopToBottomGradient
}
set {
DispatchQueue.main.async {
if newValue {
self.setGradientBackground(colorTop: self.startGradientColor, colorBottom: self.endGradientColor)
} else {
self.setGradientBackground(colorLeft: self.startGradientColor, colorRight: self.endGradientColor)
}
}
}
}
func setGradientBackground(colorLeft: UIColor, colorRight: UIColor) {
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [colorLeft.cgColor, colorRight.cgColor]
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
gradientLayer.locations = [0, 1]
gradientLayer.frame = bounds
observationGradientView = self.observe(\.bounds, options: .new) { [weak gradientLayer] view, change in
if let value = change.newValue {
gradientLayer?.frame = value
}
}
layer.insertSublayer(gradientLayer, at: 0)
}
}
Use from Storyboard
: If you want to set gradient from top to bottom then set ON
isTopToBottomGradient
key. Defalt value is OFF
