511 lines
13 KiB
Swift
511 lines
13 KiB
Swift
//
|
||
// DesignTest.swift
|
||
// FigmaConvertXib
|
||
//
|
||
// Created by Рустам Мотыгуллин on 28.07.2020.
|
||
// Copyright © 2020 mrusta. All rights reserved.
|
||
//
|
||
|
||
import UIKit
|
||
|
||
|
||
@IBDesignable
|
||
class DesignnImageView: UIView {
|
||
|
||
@IBInspectable var cornerRadius: CGFloat = 0.0
|
||
|
||
@IBInspectable var fillColor: UIColor?
|
||
@IBInspectable var image: UIImage?
|
||
@IBInspectable var imageMode: Int = 1
|
||
@IBInspectable var blur: CGFloat = 0.0
|
||
|
||
|
||
@IBInspectable var brColor: UIColor = .clear
|
||
@IBInspectable var brWidth: CGFloat = 0.0
|
||
@IBInspectable var brDash: Int = 0
|
||
|
||
func setup() {
|
||
|
||
if let foundView = viewWithTag(55) {
|
||
foundView.removeFromSuperview()
|
||
}
|
||
|
||
let d = DesignFigure_(frame: bounds)
|
||
d.backgroundColor = .clear
|
||
d.tag = 55
|
||
d.cornerRadius = cornerRadius
|
||
d.blur = blur
|
||
d.image = image
|
||
d.imageMode = imageMode
|
||
d.fillColor = fillColor
|
||
d.brWidth = brWidth
|
||
d.brColor = brColor
|
||
d.brDash = brDash
|
||
insertSubview(d, at: 0)
|
||
|
||
}
|
||
|
||
override func layoutSubviews() { setup() }
|
||
|
||
}
|
||
|
||
|
||
|
||
@IBDesignable
|
||
class DesignnGradientView: UIView {
|
||
|
||
@IBInspectable var cornerRadius: CGFloat = 0.0
|
||
|
||
@IBInspectable var fillColor: UIColor?
|
||
|
||
@IBInspectable var brColor: UIColor = .clear
|
||
@IBInspectable var brWidth: CGFloat = 0.0
|
||
@IBInspectable var brDash: Int = 0
|
||
|
||
@IBInspectable var grColor1: UIColor?
|
||
@IBInspectable var grColor2: UIColor?
|
||
@IBInspectable var grColor3: UIColor?
|
||
@IBInspectable var grStartPoint: CGPoint = .zero
|
||
@IBInspectable var grEndPoint: CGPoint = .zero
|
||
@IBInspectable var grRadial: Bool = false /// default: linear
|
||
|
||
func setup() {
|
||
|
||
if let foundView = viewWithTag(55) {
|
||
foundView.removeFromSuperview()
|
||
}
|
||
|
||
let d = DesignFigure_(frame: bounds)
|
||
d.backgroundColor = .clear
|
||
d.tag = 55
|
||
d.cornerRadius = cornerRadius
|
||
// d.blur = blur
|
||
// d.image = image
|
||
// d.imageMode = imageMode
|
||
d.fillColor = fillColor
|
||
d.brWidth = brWidth
|
||
d.brColor = brColor
|
||
d.brDash = brDash
|
||
|
||
d.grColor1 = grColor1
|
||
d.grColor2 = grColor2
|
||
d.grColor3 = grColor3
|
||
// d.grColor4 = grColor4
|
||
// d.grColor5 = grColor5
|
||
// d.grColor6 = grColor6
|
||
d.grStartPoint = grStartPoint
|
||
d.grEndPoint = grEndPoint
|
||
d.grRadial = grRadial
|
||
// d.grDrawsOptions = grDrawsOptions
|
||
// d.grDebug = grDebug
|
||
// d.grPointPercent = grPointPercent
|
||
// d.grBlendMode = grBlendMode
|
||
|
||
insertSubview(d, at: 0)
|
||
|
||
}
|
||
|
||
override func layoutSubviews() { setup() }
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
@IBDesignable
|
||
class DesignnShadowView: UIView {
|
||
|
||
@IBInspectable var cornerRadius: CGFloat = 0.0
|
||
|
||
@IBInspectable var fillColor: UIColor?
|
||
|
||
|
||
@IBInspectable var brColor: UIColor = .clear
|
||
@IBInspectable var brWidth: CGFloat = 0.0
|
||
@IBInspectable var brDash: Int = 0
|
||
|
||
@IBInspectable var shColor: UIColor = .clear
|
||
@IBInspectable var shRadius: CGFloat = 0.0
|
||
@IBInspectable var shOffset: CGSize = .zero
|
||
|
||
|
||
func setup() {
|
||
|
||
if let foundView = viewWithTag(55) {
|
||
foundView.removeFromSuperview()
|
||
}
|
||
|
||
let d = DesignFigure_(frame: bounds)
|
||
d.backgroundColor = .clear
|
||
d.tag = 55
|
||
d.cornerRadius = cornerRadius
|
||
// d.blur = blur
|
||
// d.image = image
|
||
// d.imageMode = imageMode
|
||
d.fillColor = fillColor
|
||
d.brWidth = brWidth
|
||
d.brColor = brColor
|
||
d.brDash = brDash
|
||
|
||
|
||
d.shColor = shColor
|
||
d.shRadius = shRadius
|
||
d.shOffset = shOffset
|
||
insertSubview(d, at: 0)
|
||
|
||
}
|
||
|
||
override func layoutSubviews() { setup() }
|
||
|
||
}
|
||
|
||
|
||
@IBDesignable
|
||
class DesignnView: UIView {
|
||
|
||
@IBInspectable var cornerRadius: CGFloat = 0.0
|
||
|
||
@IBInspectable var fillColor: UIColor?
|
||
|
||
|
||
@IBInspectable var brColor: UIColor = .clear
|
||
@IBInspectable var brWidth: CGFloat = 0.0
|
||
@IBInspectable var brDash: Int = 0
|
||
|
||
func setup() {
|
||
|
||
if let foundView = viewWithTag(55) {
|
||
foundView.removeFromSuperview()
|
||
}
|
||
|
||
let d = DesignFigure_(frame: bounds)
|
||
d.backgroundColor = .clear
|
||
d.tag = 55
|
||
d.cornerRadius = cornerRadius
|
||
// d.blur = blur
|
||
// d.image = image
|
||
// d.imageMode = imageMode
|
||
d.fillColor = fillColor
|
||
d.brWidth = brWidth
|
||
d.brColor = brColor
|
||
d.brDash = brDash
|
||
insertSubview(d, at: 0)
|
||
|
||
}
|
||
|
||
override func layoutSubviews() { setup() }
|
||
|
||
}
|
||
|
||
|
||
@IBDesignable
|
||
class DesignFillView_: UIView {
|
||
|
||
|
||
@IBInspectable var cornerRadius: CGFloat = 0.0
|
||
|
||
//MARK: Blur
|
||
|
||
@IBInspectable var blur: CGFloat = 0.0
|
||
|
||
//MARK: Image
|
||
|
||
@IBInspectable var image: UIImage?
|
||
@IBInspectable var imageMode: Int = 1 /// Scale to fill / Aspect fit / fill
|
||
|
||
//MARK: Fill
|
||
|
||
@IBInspectable var fillColor: UIColor?
|
||
//MARK: Border
|
||
|
||
@IBInspectable var brColor: UIColor = .clear
|
||
@IBInspectable var brWidth: CGFloat = 0.0
|
||
@IBInspectable var brDash: Int = 0
|
||
|
||
|
||
|
||
@IBInspectable var shColor: UIColor = .clear
|
||
@IBInspectable var shRadius: CGFloat = 0.0
|
||
@IBInspectable var shOffset: CGSize = .zero
|
||
|
||
//MARK: - Draw
|
||
|
||
override func draw(_ rect: CGRect) {
|
||
super.draw(rect)
|
||
|
||
guard let bezier = figurePath(bounds) else { return }
|
||
|
||
addFill(bezier: bezier)
|
||
addImage(bezier: bezier)
|
||
addBorder()
|
||
addShadow()
|
||
addBlur()
|
||
}
|
||
|
||
//MARK: - Figure Type
|
||
|
||
private func figurePath(_ rect: CGRect) -> UIBezierPath? {
|
||
return rectangle(rect: rect, radius: cornerRadius)
|
||
}
|
||
|
||
|
||
|
||
private func addImage(bezier: UIBezierPath) {
|
||
|
||
guard let image = image else { return }
|
||
guard let context = UIGraphicsGetCurrentContext() else { return }
|
||
|
||
var f: CGRect = CGRect(x: 0, y: -bounds.height, width: bounds.width, height: bounds.height)
|
||
|
||
if imageMode == 1 || imageMode == 2 {
|
||
|
||
var w: CGFloat = 0
|
||
var h: CGFloat = 0
|
||
|
||
let percent = bounds.height / image.size.height
|
||
w = image.size.width * percent
|
||
h = bounds.height
|
||
|
||
if (imageMode == 1) && (w > bounds.width) ||
|
||
(imageMode == 2) && (bounds.width > w) {
|
||
|
||
let percent = bounds.width / image.size.width
|
||
h = image.size.height * percent
|
||
w = bounds.width
|
||
}
|
||
|
||
let x = (bounds.width / 2) - (w / 2)
|
||
let y = (-h + (((bounds.height / 2) - (h / 2)) * (-1)))
|
||
|
||
f = CGRect(x: x, y: y, width: w, height: h)
|
||
}
|
||
|
||
context.saveGState()
|
||
bezier.addClip()
|
||
context.scaleBy(x: 1, y: -1)
|
||
context.draw(image.cgImage!, in: f, byTiling: false)
|
||
context.restoreGState()
|
||
|
||
}
|
||
|
||
//MARK: - Fill
|
||
|
||
private func addFill(bezier: UIBezierPath) {
|
||
|
||
guard let fillColor = fillColor else { return }
|
||
guard let context = UIGraphicsGetCurrentContext() else { return }
|
||
|
||
bezier.close()
|
||
context.saveGState()
|
||
fillColor.setFill()
|
||
bezier.fill()
|
||
context.restoreGState()
|
||
}
|
||
|
||
|
||
//MARK: - Shadow
|
||
|
||
private func addShadow() {
|
||
|
||
if shRadius < 0 { shRadius = 0 }
|
||
|
||
layer.shadowOffset = shOffset
|
||
layer.shadowOpacity = 1.0
|
||
layer.shadowRadius = shRadius
|
||
layer.shadowColor = shColor.cgColor
|
||
}
|
||
|
||
|
||
|
||
// MARK: - Border / Stroke
|
||
|
||
private func addBorder() {
|
||
|
||
if brWidth < 0 { brWidth = 0 }
|
||
|
||
guard let context = UIGraphicsGetCurrentContext() else { return }
|
||
|
||
// brColor.setStroke()
|
||
|
||
guard let bezier = figurePath(bounds) else { return }
|
||
|
||
context.saveGState()
|
||
|
||
if brDash > 0 {
|
||
|
||
UIColor.clear.setFill()
|
||
bezier.fill()
|
||
|
||
brColor.setStroke()
|
||
bezier.lineWidth = brWidth * 2
|
||
|
||
let dashPattern : [CGFloat] = [ CGFloat(brDash), CGFloat(brDash)]
|
||
bezier.setLineDash(dashPattern, count: 2, phase: 0)
|
||
bezier.stroke()
|
||
|
||
} else {
|
||
|
||
brColor.setStroke()
|
||
|
||
bezier.lineWidth = brWidth * 2
|
||
bezier.stroke()
|
||
}
|
||
|
||
|
||
|
||
bezier.stroke()
|
||
bezier.stroke()
|
||
|
||
context.restoreGState()
|
||
context.restoreGState()
|
||
}
|
||
|
||
|
||
|
||
// MARK: - Blur
|
||
|
||
private func addBlur() {
|
||
|
||
guard blur > 0 else { return }
|
||
|
||
guard let image = screenShotContext() else { return }
|
||
|
||
self.addblur(screen: image, blur: blur)
|
||
}
|
||
|
||
// MARK: Screen Shot Context
|
||
|
||
private func screenShotContext() -> UIImage? {
|
||
|
||
guard let context = UIGraphicsGetCurrentContext() else { return nil }
|
||
guard let cgimage: CGImage = context.makeImage() else { return nil }
|
||
let image = UIImage(cgImage: cgimage)
|
||
|
||
return image
|
||
}
|
||
|
||
// MARK: Clear Context
|
||
|
||
private func clearContext() {
|
||
|
||
let f = CGRect(x: 0, y: 0,
|
||
width: frame.width * 2,
|
||
height: frame.height * 2)
|
||
|
||
let context = UIGraphicsGetCurrentContext()
|
||
context?.clear(f)
|
||
}
|
||
|
||
|
||
private func addblur(screen: UIImage, blur: CGFloat) {
|
||
|
||
clearContext()
|
||
|
||
func blurImage(image: UIImage) -> UIImage? {
|
||
|
||
guard let ciscreen: CIImage = CIImage(image: screen) else { return nil }
|
||
|
||
guard let filter: CIFilter = CIFilter(name: "CIGaussianBlur") else { return nil }
|
||
filter.setDefaults()
|
||
filter.setValue(ciscreen, forKey: kCIInputImageKey)
|
||
filter.setValue(blur, forKey: kCIInputRadiusKey)
|
||
|
||
|
||
let bl2 = ((blur * 3) * -1)
|
||
let bl4 = (blur * 6)
|
||
|
||
let contextFrame = CGRect(
|
||
x: bl2,
|
||
y: bl2,
|
||
width: bl4 + image.size.width,
|
||
height: bl4 + image.size.height
|
||
)
|
||
|
||
// let bl2 = ((blur * 2) * -1)
|
||
// let bl4 = (blur * 4)
|
||
// let contextFrame2 = CGRect(x: bl2,
|
||
// y: bl2,
|
||
// width: bl4 + (frame.width * 2),
|
||
// height: bl4 + (frame.height * 2))
|
||
|
||
let ciContext = CIContext(options: nil)
|
||
guard let ci: CIImage = filter.value(forKey: kCIOutputImageKey) as? CIImage else { return nil }
|
||
guard let cImg = ciContext.createCGImage(ci, from: contextFrame) else { return nil }
|
||
|
||
let finalImage = UIImage(cgImage: cImg)
|
||
|
||
return finalImage
|
||
}
|
||
|
||
let p2: CGFloat = 1
|
||
let p4: CGFloat = p2 * 2
|
||
|
||
let bl2 = ((blur * p2) * -1)
|
||
let bl4 = (blur * p4)
|
||
|
||
let x: CGFloat = 0
|
||
let ofW = (x * 1) * -1
|
||
let ofH = (x * 1) * -1
|
||
|
||
let ofW2 = (x * 2)
|
||
let ofH2 = (x * 2)
|
||
|
||
let contextFrame = CGRect(x: bl2 + ofW,
|
||
y: bl2 + ofH,
|
||
width: bl4 + ofW2 + frame.width,
|
||
height: bl4 + ofH2 + frame.height)
|
||
|
||
let blurImageView = UIImageView(frame: contextFrame)
|
||
blurImageView.image = blurImage(image: screen)
|
||
blurImageView.contentMode = .scaleAspectFill
|
||
|
||
|
||
addSubview(blurImageView)
|
||
}
|
||
|
||
//MARK: - Rectangle Bezier
|
||
|
||
func rectangle(rect: CGRect, radius: CGFloat) -> UIBezierPath {
|
||
|
||
let r = self.cornerRadius(radius)
|
||
let w = rect.width
|
||
let h = rect.height
|
||
|
||
let path = UIBezierPath()
|
||
path.move(to: CGPoint(x: r, y: 0.0))
|
||
|
||
path.addLine(to: CGPoint(x: w - r, y: 0.0))
|
||
path.addArc(withCenter: CGPoint(x: w - r, y: r),
|
||
radius: r,
|
||
startAngle: 3.0 * .pi / 2.0,
|
||
endAngle: 2 * .pi,
|
||
clockwise: true)
|
||
|
||
path.addLine(to: CGPoint(x: w, y: h - r))
|
||
path.addArc(withCenter: CGPoint(x: w - r, y: h - r),
|
||
radius: r,
|
||
startAngle: 0.0,
|
||
endAngle: .pi / 2.0,
|
||
clockwise: true)
|
||
|
||
path.addLine(to: CGPoint(x: r, y: h))
|
||
path.addArc(withCenter: CGPoint(x: r, y: h - r),
|
||
radius: r,
|
||
startAngle: .pi / 2.0,
|
||
endAngle: .pi,
|
||
clockwise: true)
|
||
|
||
path.addLine(to: CGPoint(x: 0.0, y: r))
|
||
path.addArc(withCenter: CGPoint(x: r, y: r),
|
||
radius: r,
|
||
startAngle: .pi,
|
||
endAngle: 3.0 * .pi / 2.0,
|
||
clockwise: true)
|
||
|
||
path.close()
|
||
return path
|
||
}
|
||
|
||
}
|