如何使用 CAGradientLayer 创建渐变色

原文:How to create gradient color using CAGradientLayer @Swift Development Center

CAGradientLayer 类定义在 QuartzCore 框架下,它继承自 CALayer。为了应用渐变色,你只需要写四行代码即可。

swift 复制代码
let gradientLayer = CAGradientLayer() // 1
gradientLayer.frame = self.view.bounds // 2
gradientLayer.colors = [UIColor.magenta.cgColor, UIColor.black.cgColor] // 3
self.view.layer.addSublayer(gradientLayer) // 4
  1. 创建一个 CAGradientLayer 对象的实例。
  2. 给这个图层设置一个位置和尺寸,在我们的例子中,设置了视图的尺寸。
  3. 渐变色属性接受一个 CGColor 类型的数组,否则将无法使用。你必须提供至少两个 CGColor
  4. 将此渐变层作为子层添加到视图层中。

渐变色位置

Locations 属性接受一个 NSNumber 类型的数组。使用该属性我们可以改变渐变色的位置,默认值为 [0, 1],即从顶部开始到底部结束。0 是上,1 是下,这意味着它只接受 01 之间的值。默认情况下,位置的方向是从上往下。

swift 复制代码
let gradientLayer = CAGradientLayer()
gradientLayer.frame = self.view.bounds
gradientLayer.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]
gradientLayer.locations = [0.0, 1.0];
self.view.layer.addSublayer(gradientLayer)

对于第一张图片,我们使用下面的代码来定位:

swift 复制代码
gradientLayer.locations = [0.0, 1.0]

对于第二张图片,我们使用下面的代码来定位:

swift 复制代码
gradientLayer.locations = [0.6, 1.0]

在上面的图片中,第一张图片的默认颜色位置是 [0.0, 1.0],而第二张图片的颜色位置是 [0.6, 1.0],即从顶部的 0.6 开始。在图片中,你可以清楚地看到颜色是如何随着给定的位置而变化的。

渐变色方向

如上图所示,默认的渐变色方向是从上到下。CAGradientLayer 有两个属性 startPointendPoint,利用这个点我们可以改变渐变色的方向,比如从上到下、从下到上、从左到右、从右到左。在进行下一步之前,我们首先要了解坐标系。请看下图。左上角从 (0, 0) 开始,右上角是 (1, 0)...

从上往下

swift 复制代码
gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0)

从下往上

swift 复制代码
gradientLayer.startPoint = CGPoint(x: 0.5, y: 1.0)
gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.0)

从左往右

swift 复制代码
gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)

从右往左

swift 复制代码
gradientLayer.startPoint = CGPoint(x: 1.0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.5)

CAGradientLayer 的 UIView 扩展

最后使用下面的 UIView 扩展来绘制渐变色,只需编写一行代码。

swift 复制代码
extension UIView {
    enum Direction: Int {
        case topToBottom = 0
        case bottomToTop
        case leftToRight
        case rightToLeft
    }
    
    func applyGradient(colors: [Any]?, locations: [NSNumber]? = [0.1, 1.0], direction: Direction = .topToBottom) {
        
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = self.bounds
        gradientLayer.colors = colors
        gradientLayer.locations = locations
        
        switch direction {
        case .topToBottom:
            gradientLayer.startPoint = CGPoint(x: 0.5, y: 0.0)
            gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0)
            
        case .bottomToTop:
            gradientLayer.startPoint = CGPoint(x: 0.5, y: 1.0)
            gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.0)
            
        case .leftToRight:
            gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.5)
            gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
            
        case .rightToLeft:
            gradientLayer.startPoint = CGPoint(x: 1.0, y: 0.5)
            gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.5)
        }
        
        self.layer.addSublayer(gradientLayer)
    }
}

现在,为了在任何视图上绘制渐变色,只需写下下面一行代码,你的渐变色就实现了:

swift 复制代码
self.view.applyGradient(colors: [UIColor.red.cgColor, UIColor.blue.cgColor],
                                locations: [0.0, 1.0],
                                direction: .topToBottom)

你可以从 GitHub 下载源代码。

相关推荐
QING61816 小时前
AndroidManifest.xml中application标签属性详解 —— 新手指南
android·app·trae
百锦再18 小时前
Java与Kotlin在Android开发中的全面对比分析
android·java·google·kotlin·app·效率·趋势
CYRUS STUDIO1 天前
Android APP 热修复原理
android·app·frida·hotfix·热修复
CYRUS_STUDIO2 天前
Android APP 热修复原理
android·app·hotfix
iOS阿玮2 天前
别等了,今天是Xcode15时代的最后一天。
前端·app·apple
Jewel1052 天前
如何配置Telegram Mini-App?
前端·vue.js·app
iOS阿玮5 天前
“社交类的天塌了!”不是夸夸其谈而是确有其事!
ios·app·apple
阿阳热爱前端5 天前
BongoCat 桌宠全新升级!开源 × 跨平台,快来撸猫!
前端·rust·app
iOS阿玮6 天前
待业的两个月,让我觉得独立开发者才是职场的归宿。
前端·app
百锦再6 天前
Android Drawable 目录下的 XML 图形文件详解
android·xml·java·app·手机·安卓