| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- //
- // UIImage+Extension.swift
- // QuickSearchLocation
- //
- // Created by mac on 2024/4/10.
- //
- import UIKit
- public enum ImageGradientDirection {
- /// 水平从左到右
- 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(x: 0, y: 0), CGPoint(x: size.width, y: 0))
- case .vertical:
- return (CGPoint(x: 0, y: 0), CGPoint(x: 0, y: size.height))
- case .leftOblique:
- return (CGPoint(x: 0, y: 0), CGPoint(x: size.width, y: size.height))
- case .rightOblique:
- return (CGPoint(x: size.width, y: 0), CGPoint(x: 0, y: size.height))
- case .other(let stat, let end):
- return (stat, end)
- }
- }
- }
- 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)
- // 防止size:(0, 0)崩溃
- var drawSize = size
- if drawSize.width <= 0 || drawSize.height <= 0 {
- drawSize = CGSize(width: 1, height: 1)
- }
- UIGraphicsBeginImageContextWithOptions(drawSize, 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
- }
-
- // 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: 1, height: 1), locations:[CGFloat]? = nil, direction: ImageGradientDirection = .horizontal) -> UIImage? {
- return gradient(hexsString.map{ UIColor.hexStringColor(hexString: $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: ImageGradientDirection = .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: ImageGradientDirection = .horizontal) -> UIImage? {
- if colors.count == 0 { return nil }
- if colors.count == 1 {
- return 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
- }
- }
|