返回
iOS开发中UIColor常用的扩展
IOS
2023-09-30 05:21:22
引言
在iOS开发中,UIColor是一个至关重要的类,用于定义和使用应用程序中使用的颜色。为了简化UIColor的使用,经常会创建扩展来提供方便且高效的功能。本文将探讨一些最常用的UIColor扩展,阐明其用途以及如何将其集成到你的项目中。
扩展功能详解
1. 通过十六进制字符串创建颜色
用途: 将十六进制字符串转换为UIColor。
扩展:
extension UIColor {
convenience init(hex: String) {
let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
var int: UInt64 = 0
Scanner(string: hex).scanHexInt64(&int)
let a, r, g, b: UInt64
switch hex.count {
case 3: // RGB (12-bit)
(a, r, g, b) = (255, (int >> 8) & 0xF, (int >> 4) & 0xF, int & 0xF)
case 6: // RGB (24-bit)
(a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
case 8: // ARGB (32-bit)
(a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
default:
(a, r, g, b) = (0, 0, 0, 0)
}
self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255)
}
}
示例:
let color = UIColor(hex: "FF0000") // 红色
2. 从资产目录获取颜色
用途: 从资产目录中加载名为颜色资产的颜色。
扩展:
extension UIColor {
convenience init(asset: String) {
self.init(named: asset, in: Bundle.main, compatibleWith: nil)!
}
}
示例:
let color = UIColor(asset: "MyCustomColor")
3. 创建带有alpha值的透明颜色
用途: 使用alpha值创建一个半透明的颜色。
扩展:
extension UIColor {
func withAlpha(_ alpha: CGFloat) -> UIColor {
return self.withAlphaComponent(alpha)
}
}
示例:
let color = UIColor.red.withAlpha(0.5) // 50% 透明度的红色
4. 从图像获取平均颜色
用途: 从图像中提取平均颜色。
扩展:
extension UIColor {
convenience init(averageColorFrom image: UIImage) {
guard let cgImage = image.cgImage else {
self.init(white: 1, alpha: 1)
return
}
let width = cgImage.width
let height = cgImage.height
let bytesPerRow = cgImage.bytesPerRow
let bitsPerPixel = cgImage.bitsPerPixel
let colorSpace = CGColorSpaceCreateDeviceRGB()
let rawData = UnsafeMutablePointer<UInt8>.allocate(capacity: height * bytesPerRow)
let context = CGContext(data: rawData, width: width, height: height, bitsPerComponent: bitsPerPixel, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)!
context.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))
var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var count: CGFloat = 0
let pixelData = rawData
for index in stride(from: 0, to: height * bytesPerRow, by: 4) {
if pixelData[index] != 0 {
count += 1
red += CGFloat(pixelData[index + 1]) / 255.0
green += CGFloat(pixelData[index + 2]) / 255.0
blue += CGFloat(pixelData[index + 3]) / 255.0
}
}
rawData.deallocate()
self.init(red: red / count, green: green / count, blue: blue / count, alpha: 1)
}
}
示例:
let image = UIImage(named: "myImage.png")
let color = UIColor(averageColorFrom: image)
5. 从调色板创建颜色
用途: 从调色板中创建颜色,其中包含预定义的颜色值。
示例:
enum MyColorPalette {
case red
case green
case blue
}
extension MyColorPalette {
var color: UIColor {
switch self {
case .red:
return UIColor(red: 255 / 255, green: 0 / 255, blue: 0 / 255, alpha: 1)
case .green:
return UIColor(red: 0 / 255, green: 255 / 255, blue: 0 / 255, alpha: 1)
case .blue:
return UIColor(red: 0 / 255, green: 0 / 255, blue: 255 / 255, alpha: 1)
}
}
}
用法:
let color = MyColorPalette.red.color // 红色
结论
UIColor扩展为iOS开发人员提供了广泛的功能,使他们能够轻松有效地管理颜色。通过利用这些扩展,开发人员可以简化任务,提高代码的可读性,并创建美观且一致的应用程序界面。