Files
yingmeng-ios-switf/yinmeng-ios/Extension/UIImage/UIImage+.swift
2024-03-11 10:07:12 +08:00

180 lines
7.0 KiB
Swift
Raw 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.

//
// UIImage+.swift
// yinmeng-ios
//
// Created by yinmeng on 2024/2/21.
//
import Foundation
// MARK:- UIColor
extension UIImage{
// MARK: 2.1
///
/// - Parameters:
/// - color:
/// - size:
/// - Returns:
static func image(color: UIColor, size: CGSize = CGSize(width: 1.0, height: 1.0)) -> UIImage? {
return image(color: color, size: size, corners: .allCorners, radius: 0)
}
// MARK: 2.2
///
/// - Parameters:
/// - color:
/// - size:
/// - corners:
/// - round:
/// - Returns:
static func image(color: UIColor, size: CGSize, corners: UIRectCorner, radius: CGFloat) -> UIImage? {
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
let context = UIGraphicsGetCurrentContext()
if radius > 0 {
let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
color.setFill()
path.fill()
} else {
context?.setFillColor(color.cgColor)
context?.fill(rect)
}
let img = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return img
}
enum GradientDirection {
case horizontal //
case vertical //
case leftOblique //
case rightOblique //
case other(CGPoint, CGPoint)
public func point(size: CGSize) -> (CGPoint, CGPoint) {
switch self {
case .horizontal:
return (CGPoint.init(x: 0, y: 0), CGPoint.init(x: size.width, y: 0))
case .vertical:
return (CGPoint.init(x: 0, y: 0), CGPoint.init(x: 0, y: size.height))
case .leftOblique:
return (CGPoint.init(x: 0, y: 0), CGPoint.init(x: size.width, y: size.height))
case .rightOblique:
return (CGPoint.init(x: size.width, y: 0), CGPoint.init(x: 0, y: size.height))
case .other(let stat, let end):
return (stat, end)
}
}
}
// MARK: 2.3 ["#B0E0E6", "#00CED1", "#2E8B57"]
/// ["#B0E0E6", "#00CED1", "#2E8B57"]
/// - Parameters:
/// - hexsString:
/// - size:
/// - locations: locations
/// - direction:
/// - Returns:
static func gradient(hexsString: [String], size: CGSize = CGSize(width: 10, height: 10), locations:[CGFloat]? = nil, direction: GradientDirection = .horizontal) -> UIImage? {
return gradient(hexsString.map{ ThemeColor(hexStr: $0) }, size: size, locations: locations, direction: direction)
}
// MARK: 2.4 [UIColor, UIColor, UIColor]
/// [UIColor, UIColor, UIColor]
/// - Parameters:
/// - colors: UIColor
/// - size:
/// - locations: locations
/// - direction:
/// - Returns:
static func gradient(_ colors: [UIColor], size: CGSize = CGSize(width: 10, height: 10), locations:[CGFloat]? = nil, direction: GradientDirection = .horizontal) -> UIImage? {
return gradient(colors, size: size, radius: 0, locations: locations, direction: direction)
}
// MARK: 2.5 [UIColor, UIColor, UIColor]
/// [UIColor, UIColor, UIColor]
/// - Parameters:
/// - colors: UIColor
/// - size:
/// - radius:
/// - locations: locations
/// - direction:
/// - Returns:
static func gradient(_ colors: [UIColor],
size: CGSize = CGSize(width: 10, height: 10),
radius: CGFloat,
locations:[CGFloat]? = nil,
direction: GradientDirection = .horizontal) -> UIImage? {
if colors.count == 0 { return nil }
if colors.count == 1 {
return UIImage.image(color: colors[0])
}
UIGraphicsBeginImageContext(size)
let context = UIGraphicsGetCurrentContext()
let path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: size.width, height: size.height), cornerRadius: radius)
path.addClip()
context?.addPath(path.cgPath)
guard let gradient = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: colors.map{$0.cgColor} as CFArray, locations: locations?.map { CGFloat($0) }) else { return nil
}
let directionPoint = direction.point(size: size)
context?.drawLinearGradient(gradient, start: directionPoint.0, end: directionPoint.1, options: .drawsBeforeStartLocation)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
static func createImageWithCorners(color:UIColor, size: CGSize, topLeft: CGFloat, topRight: CGFloat, bottomLeft: CGFloat, bottomRight: CGFloat) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(size, false, 0)
guard let context = UIGraphicsGetCurrentContext() else { return nil }
let path = UIBezierPath(rect: CGRect(origin: .zero, size: size))
context.addPath(path.cgPath)
//
path.move(to: CGPoint(x: topLeft, y: 0))
path.addLine(to: CGPoint(x: 0, y: topLeft))
if topLeft > 0 {
path.addArc(withCenter: CGPoint(x: topLeft, y: topLeft), radius: topLeft, startAngle: CGFloat.pi, endAngle: CGFloat.pi * 3 / 2, clockwise: true)
}
//
let topRightFrom = CGPoint(x: size.width - topRight, y: 0)
path.addLine(to: topRightFrom)
if topRight > 0 {
path.addArc(withCenter: CGPoint(x: size.width - topRight, y: topRight), radius: topRight, startAngle: CGFloat.pi * 3 / 2, endAngle: CGFloat.pi, clockwise: true)
}
//
let bottomLeftFrom = CGPoint(x: 0, y: size.height - bottomLeft)
path.addLine(to: bottomLeftFrom)
if bottomLeft > 0 {
path.addArc(withCenter: CGPoint(x: bottomLeft, y: size.height - bottomLeft), radius: bottomLeft, startAngle: 0, endAngle: CGFloat.pi / 2, clockwise: false)
}
//
path.addLine(to: CGPoint(x: size.width, y: size.height - bottomRight))
if bottomRight > 0 {
path.addArc(withCenter: CGPoint(x: size.width - bottomRight, y: size.height - bottomRight), radius: bottomRight, startAngle: CGFloat.pi / 2, endAngle: 0, clockwise: false)
}
path.close()
context.clip()
//
context.setFillColor(color.cgColor)
context.fillPath()
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
extension UIImage{
static func getDefaultAvatar() -> UIImage?{
return UIImage(named: "yin_default_avatar") ?? nil
}
}