如何使用 UIGraphicsGetCurrentContext 应用渐变颜色
How to apply Gradient color using UIGraphicsGetCurrentContext
我正在使用以下代码绘制三角形
class TriangleView : UIView {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func draw(_ rect: CGRect) {
guard let context = UIGraphicsGetCurrentContext() else { return }
context.beginPath()
context.move(to: CGPoint(x: (rect.maxX / 2.0), y: rect.maxY))
context.addLine(to: CGPoint(x: rect.maxX, y: rect.minY))
context.addLine(to: CGPoint(x: rect.minX, y: rect.minY))
context.closePath()
context.setFillColor(red: 0.0, green: 0.7, blue: 0.0, alpha: 1)
context.fillPath()
}
}
倒数第二行用绿色填充颜色。
我想用渐变色替换这个绿色。
我试过的代码如下
let triangle = TriangleView(frame: CGRect(x: triangleX, y: triangleY, width: triangleWidth , height: triangleHeight))
// MAKING GRADIENT COLOR
gradientLayer = CAGradientLayer()
gradientLayer.colors = [UIColor.red.cgColor, UIColor.yellow.cgColor]
triangle.layer.addSublayer(gradientLayer)
triangle.backgroundColor = UIColor.clear
没有效果,颜色还是绿色
使用 CGContext 向路径添加渐变有点困难。如果您有兴趣,可以使用此解决方案:
How to fill a path with gradient in drawRect:?
但是,我更喜欢使用 CAShapeLayer 并屏蔽我的 CAGradientLayer。
我发现它更简单,代码更少。
class View: UIView {
var gradientLayer = CAGradientLayer()
override init(frame: CGRect) {
super.init(frame: frame)
let gradientMask = CAShapeLayer()
let path = CGMutablePath()
path.move(to: CGPoint(x: (bounds.maxX / 2.0), y: bounds.maxY))
path.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
path.addLine(to: CGPoint(x: bounds.minX, y: bounds.minY))
path.closeSubpath()
gradientMask.path = path
gradientLayer.colors = [UIColor.red, UIColor.yellow].map{[=10=].cgColor}
gradientLayer.mask = gradientMask
layer.insertSublayer(gradientLayer, at: 0)
}
override func layoutSubviews() {
super.layoutSubviews()
gradientLayer.frame = bounds
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
我用了 playground 得到了这样的东西:
我正在使用以下代码绘制三角形
class TriangleView : UIView {
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func draw(_ rect: CGRect) {
guard let context = UIGraphicsGetCurrentContext() else { return }
context.beginPath()
context.move(to: CGPoint(x: (rect.maxX / 2.0), y: rect.maxY))
context.addLine(to: CGPoint(x: rect.maxX, y: rect.minY))
context.addLine(to: CGPoint(x: rect.minX, y: rect.minY))
context.closePath()
context.setFillColor(red: 0.0, green: 0.7, blue: 0.0, alpha: 1)
context.fillPath()
}
}
倒数第二行用绿色填充颜色。 我想用渐变色替换这个绿色。
我试过的代码如下
let triangle = TriangleView(frame: CGRect(x: triangleX, y: triangleY, width: triangleWidth , height: triangleHeight))
// MAKING GRADIENT COLOR
gradientLayer = CAGradientLayer()
gradientLayer.colors = [UIColor.red.cgColor, UIColor.yellow.cgColor]
triangle.layer.addSublayer(gradientLayer)
triangle.backgroundColor = UIColor.clear
没有效果,颜色还是绿色
使用 CGContext 向路径添加渐变有点困难。如果您有兴趣,可以使用此解决方案: How to fill a path with gradient in drawRect:?
但是,我更喜欢使用 CAShapeLayer 并屏蔽我的 CAGradientLayer。 我发现它更简单,代码更少。
class View: UIView {
var gradientLayer = CAGradientLayer()
override init(frame: CGRect) {
super.init(frame: frame)
let gradientMask = CAShapeLayer()
let path = CGMutablePath()
path.move(to: CGPoint(x: (bounds.maxX / 2.0), y: bounds.maxY))
path.addLine(to: CGPoint(x: bounds.maxX, y: bounds.minY))
path.addLine(to: CGPoint(x: bounds.minX, y: bounds.minY))
path.closeSubpath()
gradientMask.path = path
gradientLayer.colors = [UIColor.red, UIColor.yellow].map{[=10=].cgColor}
gradientLayer.mask = gradientMask
layer.insertSublayer(gradientLayer, at: 0)
}
override func layoutSubviews() {
super.layoutSubviews()
gradientLayer.frame = bounds
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
}
我用了 playground 得到了这样的东西: