我正在尝试应用渐变作为视图的背景颜色(故事板的主视图).代码运行,但没有任何变化.我正在使用xCode Beta 2和Swift.
这是代码:
class Colors { let colorTop = UIColor(red: 192.0/255.0, green: 38.0/255.0, blue: 42.0/255.0, alpha: 1.0) let colorBottom = UIColor(red: 35.0/255.0, green: 2.0/255.0, blue: 2.0/255.0, alpha: 1.0) let gl: CAGradientLayer init() { gl = CAGradientLayer() gl.colors = [ colorTop, colorBottom] gl.locations = [ 0.0, 1.0] } }
然后在视图控制器中:
let colors = Colors() func refresh() { view.backgroundColor = UIColor.clearColor() var backgroundLayer = colors.gl backgroundLayer.frame = view.frame view.layer.insertSublayer(backgroundLayer, atIndex: 0) } } }
Leo Dabus.. 153
Xcode 8.2•Swift 3.0.2
您可以设计自己的渐变视图,如下所示:
@IBDesignable class GradientView: UIView { @IBInspectable var startColor: UIColor = .black { didSet { updateColors() }} @IBInspectable var endColor: UIColor = .white { didSet { updateColors() }} @IBInspectable var startLocation: Double = 0.05 { didSet { updateLocations() }} @IBInspectable var endLocation: Double = 0.95 { didSet { updateLocations() }} @IBInspectable var horizontalMode: Bool = false { didSet { updatePoints() }} @IBInspectable var diagonalMode: Bool = false { didSet { updatePoints() }} override public class var layerClass: AnyClass { CAGradientLayer.self } var gradientLayer: CAGradientLayer { layer as! CAGradientLayer } func updatePoints() { if horizontalMode { gradientLayer.startPoint = diagonalMode ? .init(x: 1, y: 0) : .init(x: 0, y: 0.5) gradientLayer.endPoint = diagonalMode ? .init(x: 0, y: 1) : .init(x: 1, y: 0.5) } else { gradientLayer.startPoint = diagonalMode ? .init(x: 0, y: 0) : .init(x: 0.5, y: 0) gradientLayer.endPoint = diagonalMode ? .init(x: 1, y: 1) : .init(x: 0.5, y: 1) } } func updateLocations() { gradientLayer.locations = [startLocation as NSNumber, endLocation as NSNumber] } func updateColors() { gradientLayer.colors = [startColor.cgColor, endColor.cgColor] } override public func layoutSubviews() { super.layoutSubviews() updatePoints() updateLocations() updateColors() } }
Xcode 8.2•Swift 3.0.2
您可以设计自己的渐变视图,如下所示:
@IBDesignable class GradientView: UIView { @IBInspectable var startColor: UIColor = .black { didSet { updateColors() }} @IBInspectable var endColor: UIColor = .white { didSet { updateColors() }} @IBInspectable var startLocation: Double = 0.05 { didSet { updateLocations() }} @IBInspectable var endLocation: Double = 0.95 { didSet { updateLocations() }} @IBInspectable var horizontalMode: Bool = false { didSet { updatePoints() }} @IBInspectable var diagonalMode: Bool = false { didSet { updatePoints() }} override public class var layerClass: AnyClass { CAGradientLayer.self } var gradientLayer: CAGradientLayer { layer as! CAGradientLayer } func updatePoints() { if horizontalMode { gradientLayer.startPoint = diagonalMode ? .init(x: 1, y: 0) : .init(x: 0, y: 0.5) gradientLayer.endPoint = diagonalMode ? .init(x: 0, y: 1) : .init(x: 1, y: 0.5) } else { gradientLayer.startPoint = diagonalMode ? .init(x: 0, y: 0) : .init(x: 0.5, y: 0) gradientLayer.endPoint = diagonalMode ? .init(x: 1, y: 1) : .init(x: 0.5, y: 1) } } func updateLocations() { gradientLayer.locations = [startLocation as NSNumber, endLocation as NSNumber] } func updateColors() { gradientLayer.colors = [startColor.cgColor, endColor.cgColor] } override public func layoutSubviews() { super.layoutSubviews() updatePoints() updateLocations() updateColors() } }
只是修改上面提到的答案.
func setGradientBackground() { let colorTop = UIColor(red: 255.0/255.0, green: 149.0/255.0, blue: 0.0/255.0, alpha: 1.0).CGColor let colorBottom = UIColor(red: 255.0/255.0, green: 94.0/255.0, blue: 58.0/255.0, alpha: 1.0).CGColor let gradientLayer = CAGradientLayer() gradientLayer.colors = [colorTop, colorBottom] gradientLayer.locations = [0.0, 1.0] gradientLayer.frame = self.view.bounds self.view.layer.insertSublayer(gradientLayer, at:0) }
我制作了一个UIView扩展,将基本渐变应用于任何视图
extension UIView { func layerGradient() { let layer : CAGradientLayer = CAGradientLayer() layer.frame.size = self.frame.size layer.frame.origin = CGPointMake(0.0,0.0) layer.cornerRadius = CGFloat(frame.width / 20) let color0 = UIColor(red:250.0/255, green:250.0/255, blue:250.0/255, alpha:0.5).CGColor let color1 = UIColor(red:200.0/255, green:200.0/255, blue: 200.0/255, alpha:0.1).CGColor let color2 = UIColor(red:150.0/255, green:150.0/255, blue: 150.0/255, alpha:0.1).CGColor let color3 = UIColor(red:100.0/255, green:100.0/255, blue: 100.0/255, alpha:0.1).CGColor let color4 = UIColor(red:50.0/255, green:50.0/255, blue:50.0/255, alpha:0.1).CGColor let color5 = UIColor(red:0.0/255, green:0.0/255, blue:0.0/255, alpha:0.1).CGColor let color6 = UIColor(red:150.0/255, green:150.0/255, blue:150.0/255, alpha:0.1).CGColor layer.colors = [color0,color1,color2,color3,color4,color5,color6] self.layer.insertSublayer(layer, atIndex: 0) } }
您为渐变提供的颜色必须是类型CGColor
.所以设置你的数组CGColor
为gl.colors
.
正确的代码是:
class Colors { var gl:CAGradientLayer! init() { let colorTop = UIColor(red: 192.0 / 255.0, green: 38.0 / 255.0, blue: 42.0 / 255.0, alpha: 1.0).cgColor let colorBottom = UIColor(red: 35.0 / 255.0, green: 2.0 / 255.0, blue: 2.0 / 255.0, alpha: 1.0).cgColor self.gl = CAGradientLayer() self.gl.colors = [colorTop, colorBottom] self.gl.locations = [0.0, 1.0] } }
如果您需要更改渐变的方向,则必须使用startPoint和endPoint.
let gradient: CAGradientLayer = CAGradientLayer() gradient.colors = [UIColor.blue.cgColor, UIColor.red.cgColor] gradient.locations = [0.0 , 1.0] gradient.startPoint = CGPoint(x: 0.0, y: 1.0) gradient.endPoint = CGPoint(x: 1.0, y: 1.0) gradient.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.size.width, height: self.view.frame.size.height) self.view.layer.insertSublayer(gradient, atIndex: 0)
UIView
使用此自定义类进行扩展.
GradientView.swift
import UIKit class GradientView: UIView { // Default Colors var colors:[UIColor] = [UIColor.redColor(), UIColor.blueColor()] override func drawRect(rect: CGRect) { // Must be set when the rect is drawn setGradient(colors[0], color2: colors[1]) } func setGradient(color1: UIColor, color2: UIColor) { let context = UIGraphicsGetCurrentContext() let gradient = CGGradientCreateWithColors(CGColorSpaceCreateDeviceRGB(), [color1.CGColor, color2.CGColor], [0, 1])! // Draw Path let path = UIBezierPath(rect: CGRectMake(0, 0, frame.width, frame.height)) CGContextSaveGState(context) path.addClip() CGContextDrawLinearGradient(context, gradient, CGPointMake(frame.width / 2, 0), CGPointMake(frame.width / 2, frame.height), CGGradientDrawingOptions()) CGContextRestoreGState(context) } override func layoutSubviews() { // Ensure view has a transparent background color (not required) backgroundColor = UIColor.clearColor() } }
用法
gradientView.colors = [UIColor.blackColor().colorWithAlphaComponent(0.8), UIColor.clearColor()]
结果
这简单
// MARK: - Gradient extension CAGradientLayer { enum Point { case topLeft case centerLeft case bottomLeft case topCenter case center case bottomCenter case topRight case centerRight case bottomRight var point: CGPoint { switch self { case .topLeft: return CGPoint(x: 0, y: 0) case .centerLeft: return CGPoint(x: 0, y: 0.5) case .bottomLeft: return CGPoint(x: 0, y: 1.0) case .topCenter: return CGPoint(x: 0.5, y: 0) case .center: return CGPoint(x: 0.5, y: 0.5) case .bottomCenter: return CGPoint(x: 0.5, y: 1.0) case .topRight: return CGPoint(x: 1.0, y: 0.0) case .centerRight: return CGPoint(x: 1.0, y: 0.5) case .bottomRight: return CGPoint(x: 1.0, y: 1.0) } } } convenience init(start: Point, end: Point, colors: [CGColor], type: CAGradientLayerType) { self.init() self.startPoint = start.point self.endPoint = end.point self.colors = colors self.locations = (0..<colors.count).map(NSNumber.init) self.type = type } }
像这样使用:
let fistColor = UIColor.white let lastColor = UIColor.black let gradient = CAGradientLayer(start: .topLeft, end: .topRight, colors: [fistColor.cgColor, lastColor.cgColor], type: .radial) gradient.frame = yourView.bounds yourView.layer.addSublayer(gradient)
我有这些扩展:
@IBDesignable class GradientView: UIView { @IBInspectable var firstColor: UIColor = UIColor.red @IBInspectable var secondColor: UIColor = UIColor.green @IBInspectable var vertical: Bool = true lazy var gradientLayer: CAGradientLayer = { let layer = CAGradientLayer() layer.colors = [firstColor.cgColor, secondColor.cgColor] layer.startPoint = CGPoint.zero return layer }() //MARK: - required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) applyGradient() } override init(frame: CGRect) { super.init(frame: frame) applyGradient() } override func prepareForInterfaceBuilder() { super.prepareForInterfaceBuilder() applyGradient() } override func layoutSubviews() { super.layoutSubviews() updateGradientFrame() } //MARK: - func applyGradient() { updateGradientDirection() layer.sublayers = [gradientLayer] } func updateGradientFrame() { gradientLayer.frame = bounds } func updateGradientDirection() { gradientLayer.endPoint = vertical ? CGPoint(x: 0, y: 1) : CGPoint(x: 1, y: 0) } } @IBDesignable class ThreeColorsGradientView: UIView { @IBInspectable var firstColor: UIColor = UIColor.red @IBInspectable var secondColor: UIColor = UIColor.green @IBInspectable var thirdColor: UIColor = UIColor.blue @IBInspectable var vertical: Bool = true { didSet { updateGradientDirection() } } lazy var gradientLayer: CAGradientLayer = { let layer = CAGradientLayer() layer.colors = [firstColor.cgColor, secondColor.cgColor, thirdColor.cgColor] layer.startPoint = CGPoint.zero return layer }() //MARK: - required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) applyGradient() } override init(frame: CGRect) { super.init(frame: frame) applyGradient() } override func prepareForInterfaceBuilder() { super.prepareForInterfaceBuilder() applyGradient() } override func layoutSubviews() { super.layoutSubviews() updateGradientFrame() } //MARK: - func applyGradient() { updateGradientDirection() layer.sublayers = [gradientLayer] } func updateGradientFrame() { gradientLayer.frame = bounds } func updateGradientDirection() { gradientLayer.endPoint = vertical ? CGPoint(x: 0, y: 1) : CGPoint(x: 1, y: 0) } } @IBDesignable class RadialGradientView: UIView { @IBInspectable var outsideColor: UIColor = UIColor.red @IBInspectable var insideColor: UIColor = UIColor.green override func awakeFromNib() { super.awakeFromNib() applyGradient() } func applyGradient() { let colors = [insideColor.cgColor, outsideColor.cgColor] as CFArray let endRadius = sqrt(pow(frame.width/2, 2) + pow(frame.height/2, 2)) let center = CGPoint(x: bounds.size.width / 2, y: bounds.size.height / 2) let gradient = CGGradient(colorsSpace: nil, colors: colors, locations: nil) let context = UIGraphicsGetCurrentContext() context?.drawRadialGradient(gradient!, startCenter: center, startRadius: 0.0, endCenter: center, endRadius: endRadius, options: CGGradientDrawingOptions.drawsBeforeStartLocation) } override func draw(_ rect: CGRect) { super.draw(rect) #if TARGET_INTERFACE_BUILDER applyGradient() #endif } }
用法:
试试这个,它对我有用,
var gradientView = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 35)) let gradientLayer:CAGradientLayer = CAGradientLayer() gradientLayer.frame.size = self.gradientView.frame.size gradientLayer.colors = [UIColor.white.cgColor,UIColor.red.withAlphaComponent(1).cgColor] //Use diffrent colors gradientView.layer.addSublayer(gradientLayer)
您可以添加渐变颜色的起点和终点.
gradientLayer.startPoint = CGPoint(x: 0.0, y: 1.0) gradientLayer.endPoint = CGPoint(x: 1.0, y: 1.0)
有关更多详细说明,请参阅最佳答案,或者您可以关注Apple的CAGradientLayer
希望这对某些人有帮助.
斯威夫特4
添加视图插座
@IBOutlet weak var gradientView: UIView!
向视图添加渐变
func setGradient() { let gradient: CAGradientLayer = CAGradientLayer() gradient.colors = [UIColor.red.cgColor, UIColor.blue.cgColor] gradient.locations = [0.0 , 1.0] gradient.startPoint = CGPoint(x: 0.0, y: 1.0) gradient.endPoint = CGPoint(x: 1.0, y: 1.0) gradient.frame = gradientView.layer.frame gradientView.layer.insertSublayer(gradient, at: 0) }
在Swift3中试试这个:
func addGradient(){ let gradient:CAGradientLayer = CAGradientLayer() gradient.frame.size = self.viewThatHoldsGradient.frame.size gradient.colors = [UIColor.white.cgColor,UIColor.white.withAlphaComponent(0).cgColor] //Or any colors self.viewThatHoldsGradient.layer.addSublayer(gradient) }
此代码适用于Swift 3.0
class GradientView: UIView { override open class var layerClass: AnyClass { get{ return CAGradientLayer.classForCoder() } } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) let gradientLayer = self.layer as! CAGradientLayer let color1 = UIColor.white.withAlphaComponent(0.1).cgColor as CGColor let color2 = UIColor.white.withAlphaComponent(0.9).cgColor as CGColor gradientLayer.locations = [0.60, 1.0] gradientLayer.colors = [color2, color1] } }