173 lines
5.9 KiB
Swift
173 lines
5.9 KiB
Swift
//
|
||
// DesignLabel.swift
|
||
// FigmaConvertXib
|
||
//
|
||
// Created by Рустам Мотыгуллин on 25.07.2020.
|
||
// Copyright © 2020 mrusta. All rights reserved.
|
||
//
|
||
|
||
import UIKit
|
||
|
||
@IBDesignable
|
||
class DesignLabel: UILabel {
|
||
|
||
//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
|
||
|
||
@IBInspectable var grRadial: Bool = false /// default: linear
|
||
@IBInspectable var grDrawsOptions: Bool = true
|
||
@IBInspectable var grDebug: Bool = false
|
||
@IBInspectable var grPointPercent: Bool = true
|
||
@IBInspectable var grBlendMode: Int = 20 /// заполнители
|
||
|
||
//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: - Draw
|
||
|
||
override func draw(_ rect: CGRect) {
|
||
super.draw(rect)
|
||
shadow()
|
||
gradient()
|
||
gradientDebug()
|
||
border()
|
||
}
|
||
|
||
//MARK: - Add Shadow
|
||
|
||
private func shadow() {
|
||
layer.shadowOpacity = 1.0
|
||
layer.shadowOffset = shOffset
|
||
layer.shadowRadius = shRadius
|
||
layer.shadowColor = shColor.cgColor
|
||
}
|
||
|
||
//MARK: - Add Border
|
||
|
||
func border() {
|
||
|
||
guard brColor != .clear, brWidth != 0.0 else { return }
|
||
|
||
let borderLabel = UILabel(frame: bounds)
|
||
borderLabel.text = text
|
||
borderLabel.font = font
|
||
borderLabel.textColor = .clear
|
||
borderLabel.numberOfLines = numberOfLines
|
||
borderLabel.backgroundColor = .clear
|
||
|
||
|
||
let strokeTextAttributes: [NSAttributedString.Key : Any] = [
|
||
.strokeColor : brColor,
|
||
.strokeWidth : (-1 * (brWidth * 2)),
|
||
]
|
||
|
||
borderLabel.attributedText = NSAttributedString(string: text ?? "",
|
||
attributes: strokeTextAttributes)
|
||
|
||
addSubview(borderLabel)
|
||
}
|
||
|
||
//MARK: - Add Gradient
|
||
|
||
func gradient() {
|
||
var colors: [CGColor] = []
|
||
|
||
if grColor1 != nil || grColor2 != nil || grColor3 != nil || grColor4 != nil || grColor5 != nil {
|
||
|
||
if let color1 = grColor1 { colors.append(color1.cgColor) }
|
||
if let color2 = grColor2 { colors.append(color2.cgColor) }
|
||
if let color3 = grColor3 { colors.append(color3.cgColor) }
|
||
if let color4 = grColor4 { colors.append(color4.cgColor) }
|
||
if let color5 = grColor5 { colors.append(color5.cgColor) }
|
||
if let color6 = grColor6 { colors.append(color6.cgColor) }
|
||
|
||
} else { return }
|
||
|
||
guard let gradient = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(),
|
||
colors: colors as CFArray,
|
||
locations: nil) else { return }
|
||
|
||
guard let context = UIGraphicsGetCurrentContext() else { return }
|
||
|
||
let bMode = CGBlendMode(rawValue: CGBlendMode.RawValue(grBlendMode)) ?? CGBlendMode.sourceAtop
|
||
context.setBlendMode(bMode)
|
||
|
||
let options: CGGradientDrawingOptions =
|
||
grDrawsOptions ? [ .drawsBeforeStartLocation, .drawsAfterEndLocation ] : [ ]
|
||
|
||
|
||
if grPointPercent {
|
||
grEndPoint = CGPoint(x: grEndPoint.x * frame.width, y: grEndPoint.y * frame.height)
|
||
grStartPoint = CGPoint(x: grStartPoint.x * frame.width, y: grStartPoint.y * frame.height)
|
||
}
|
||
|
||
//MARK: Gr. Radial / Linear
|
||
if grRadial {
|
||
let x: CGFloat = (grEndPoint.x - grStartPoint.x)
|
||
let y: CGFloat = (grEndPoint.y - grStartPoint.y)
|
||
let distance: CGFloat = sqrt((x * x) + (y * y))
|
||
|
||
context.drawRadialGradient(gradient,
|
||
startCenter: grStartPoint,
|
||
startRadius: 0,
|
||
endCenter: grStartPoint,
|
||
endRadius: distance,
|
||
options: options)
|
||
} else {
|
||
context.drawLinearGradient(gradient,
|
||
start: grStartPoint,
|
||
end: grEndPoint,
|
||
options: options)
|
||
}
|
||
context.saveGState()
|
||
|
||
}
|
||
|
||
//MARK: - Gr. Debug
|
||
|
||
func gradientDebug() {
|
||
guard let context = UIGraphicsGetCurrentContext() else { return }
|
||
guard grDebug else { return }
|
||
|
||
context.setBlendMode(CGBlendMode.normal)
|
||
context.setLineWidth(3.0)
|
||
context.setFillColor(UIColor.black.cgColor)
|
||
context.setStrokeColor(UIColor.systemRed.cgColor)
|
||
|
||
let ellipseRadius: CGFloat = 5
|
||
let circleRect = CGRect(x: grStartPoint.x - ellipseRadius,
|
||
y: grStartPoint.y - ellipseRadius,
|
||
width: ellipseRadius * 2,
|
||
height: ellipseRadius * 2)
|
||
|
||
context.fillEllipse(in: circleRect)
|
||
context.strokeEllipse(in: circleRect)
|
||
context.setStrokeColor(UIColor.green.cgColor)
|
||
|
||
let circleRect2 = CGRect(x: grEndPoint.x - ellipseRadius,
|
||
y: grEndPoint.y - ellipseRadius,
|
||
width: ellipseRadius * 2,
|
||
height: ellipseRadius * 2)
|
||
|
||
context.fillEllipse(in: circleRect2)
|
||
context.strokeEllipse(in: circleRect2)
|
||
}
|
||
|
||
}
|