Files

173 lines
5.9 KiB
Swift
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// 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)
}
}