Files
ContainerController/Example/ContainerControllerSwift/Framework/Designable/DesignLabel.swift
T

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)
}
}