Files

185 lines
4.9 KiB
Swift

import UIKit
@IBDesignable
class DesignButton: UIButton {
@IBInspectable var hideAnimation: Bool = true
//MARK: Fill
@IBInspectable var fillColor: UIColor = .clear
//MARK: Gradient
@IBInspectable var grColor1: UIColor?
@IBInspectable var grColor2: UIColor?
@IBInspectable var grColor3: UIColor?
@IBInspectable var grColor4: UIColor?
@IBInspectable var grColor5: UIColor?
@IBInspectable var grColor6: UIColor?
@IBInspectable var grStartPoint: CGPoint = .zero
@IBInspectable var grEndPoint: CGPoint = .zero
//MARK: Inner Shadow
@IBInspectable var inShColor: UIColor = .clear
@IBInspectable var inShRadius: CGFloat = 0.0
@IBInspectable var inShOffset: CGSize = .zero
//MARK: Shadow
@IBInspectable var shColor: UIColor = .clear
@IBInspectable var shRadius: CGFloat = 0.0
@IBInspectable var shOffset: CGSize = .zero
//MARK: Border
@IBInspectable var brColor: UIColor = .clear
@IBInspectable var brWidth: CGFloat = 0.0
//MARK: Blur
@IBInspectable var blur: CGFloat = 0.0
//MARK: Radius
@IBInspectable var cornerRadius: CGFloat = 0.0
override func draw(_ rect: CGRect) {
layer.cornerRadius = self.cornerRadius(cornerRadius)
layer.backgroundColor = fillColor.cgColor
addGradient()
addInnerShadow()
addShadow()
addBorder()
add(blur: blur)
}
private func addGradient() {
_ = add(gradient: grColor1,
color2: grColor2,
color3: grColor3,
color4: grColor4,
color5: grColor5,
color6: grColor6,
pointStart: grStartPoint,
pointEnd: grEndPoint,
cornerRadius: cornerRadius)
}
private func addInnerShadow() {
addInnerShadow(color: inShColor,
radius: inShRadius,
offset: inShOffset,
cornerRadius: cornerRadius)
}
private func addShadow() {
layer.shadowOffset = shOffset
layer.shadowOpacity = 1.0
layer.shadowRadius = shRadius
layer.shadowColor = shColor.cgColor
}
private func addBorder() {
layer.borderColor = brColor.cgColor
layer.borderWidth = brWidth
}
override var isSelected: Bool {
didSet {
super.isSelected = isSelected
}
}
override var isHighlighted: Bool {
didSet {
// super.isHighlighted = isHighlighted
}
}
override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
selectedLayer(show: true)
return super.beginTracking(touch, with: event)
}
override func continueTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
let point = touch.location(in: self)
let someFrame = bounds
let highlighted = someFrame.contains(point)
selectedLayer(show: highlighted)
return super.continueTracking(touch, with: event)
}
override func endTracking(_ touch: UITouch?, with event: UIEvent?) {
selectedLayer(show: false)
super.endTracking(touch, with: event)
}
override func cancelTracking(with event: UIEvent?) {
selectedLayer(show: false)
super.cancelTracking(with: event)
}
func radius() -> CGFloat {
let minSize = min(frame.size.width, frame.size.height)
let radius = ((cornerRadius < 0) ? (minSize / 2) : cornerRadius)
return radius
}
func selectedLayer(show: Bool) {
func selectAnimationHide(show: Bool) {
if show {
setAlpha(.halfTransluent)
} else {
UIView.animate(with: .ms350) {
self.setAlpha(.visible)
}
}
}
func selectAnimationShadow(show: Bool) {
let tag = 1
let view = viewWithTag(tag)
if show {
if view == nil {
let view = UIView(frame: bounds)
view.backgroundColor = UIColor.init(white: 0.0, alpha: 0.2)
view.tag = tag
view.layer.cornerRadius = radius()
addSubview(view)
}
} else {
if let view = view {
UIView.animate(with: .ms350, animations: {
view.setAlpha(.invisible)
}, completion: { (fin: Bool) in
view.removeFromSuperview()
})
}
}
}
if hideAnimation {
selectAnimationHide(show: show)
} else {
selectAnimationShadow(show: show)
}
}
}