我一直试图产生一个基本的径向渐变背景,但没有成功.我设法得到一个线性渐变工作,如下面的代码所示,但我不知道如何使其不同的颜色径向 - 如下图所示.任何帮助将不胜感激.:)
override func viewDidLoad() {
super.viewDidLoad()
//A linear Gradient Consists of two colours: top colour and bottom colour
let topColor = UIColor(red: 15.0/255.0, green: 118.0/255.0, blue: 128.0/255.0, alpha: 1.0)
let bottomColor = UIColor(red: 84.0/255.0, green: 187.0/255.0, blue: 187.0/255.0, alpha: 1.0)
//Add the top and bottom colours to an array and setup the location of those two.
let gradientColors: [CGColor] = [topColor.CGColor, bottomColor.CGColor]
let gradientLocations: [CGFloat] = [0.0, 1.0]
//Create a Gradient CA layer
let gradientLayer: CAGradientLayer = CAGradientLayer()
gradientLayer.colors = gradientColors
gradientLayer.locations = gradientLocations
gradientLayer.frame = self.view.bounds
self.view.layer.insertSublayer(gradientLayer, atIndex: 0)
}
Run Code Online (Sandbox Code Playgroud)
Fat*_*tie 26
多年来,您只需这样做:
class GlowBall: UIView {
private lazy var pulse: CAGradientLayer = {
let l = CAGradientLayer()
l.type = .radial
l.colors = [ UIColor.red.cgColor,
UIColor.yellow.cgColor,
UIColor.green.cgColor,
UIColor.blue.cgColor]
l.locations = [ 0, 0.3, 0.7, 1 ]
l.startPoint = CGPoint(x: 0.5, y: 0.5)
l.endPoint = CGPoint(x: 1, y: 1)
layer.addSublayer(l)
return l
}()
override func layoutSubviews() {
super.layoutSubviews()
pulse.frame = bounds
pulse.cornerRadius = bounds.width / 2.0
}
}
Run Code Online (Sandbox Code Playgroud)
关键行是:
l.colors = [ UIColor.red.cgColor,
UIColor.yellow.cgColor,
UIColor.green.cgColor,
UIColor.blue.cgColor]
l.locations = [ 0, 0.3, 0.7, 1 ]
Run Code Online (Sandbox Code Playgroud)
请注意,您可以根据需要更改“拉伸”...
l.locations = [ 0, 0.1, 0.2, 1 ]
Run Code Online (Sandbox Code Playgroud)
使用任何你喜欢的颜色
l.colors = [ UIColor.systemBlue.cgColor,
UIColor.systemPink.cgColor,
UIColor.systemBlue.cgColor,
UIColor.systemPink.cgColor,
UIColor.systemBlue.cgColor,
UIColor.systemPink.cgColor,
UIColor.systemBlue.cgColor,
UIColor.systemPink.cgColor]
l.locations = [ 0,0.1,0.2,0.3,0.4,0.5,0.6,1 ]
Run Code Online (Sandbox Code Playgroud)
现在真的很容易。
假设你想要Yellow,在 0.6 处有一条蓝色带:
l.colors = [ UIColor.yellow.cgColor,
UIColor.blue.cgColor,
UIColor.yellow.cgColor]
l.locations = [ 0, 0.6, 1 ]
Run Code Online (Sandbox Code Playgroud)
这很好用。
# yellow...
# blue...
# yellow...
Run Code Online (Sandbox Code Playgroud)
但通常你这样做:
# yellow...
# yellow...
# blue...
# yellow...
# yellow...
Run Code Online (Sandbox Code Playgroud)
请注意,每一端都有两个黄色......
l.colors = [ UIColor.yellow.cgColor,
UIColor.yellow.cgColor,
UIColor.blue.cgColor,
UIColor.yellow.cgColor,
UIColor.yellow.cgColor]
Run Code Online (Sandbox Code Playgroud)
这样就可以控制蓝带的“宽度”了:
在这个例子中:蓝色带将窄而尖锐:
l.locations = [ 0, 0.58, 0.6, 0.68, 1 ]
Run Code Online (Sandbox Code Playgroud)
在这个例子中,蓝色带将是宽而柔和的:
l.locations = [ 0, 0.5, 0.6, 0.7, 1 ]
Run Code Online (Sandbox Code Playgroud)
这确实是您如何控制渐变并获得所需外观的秘诀。
注意这是 - 非常简单 - 一个 UIView !
class GlowBall: UIView { ...
Run Code Online (Sandbox Code Playgroud)
因此简单地
在故事板中,在你想要的地方放置一个 UIView
在故事板中,将类更改为“GlowBall”而不是 UIView
你完成了!
Zel*_* B. 21
看看我的RadialGradientLayer实现,并随意修改它
class RadialGradientLayer: CALayer {
override init(){
super.init()
needsDisplayOnBoundsChange = true
}
init(center:CGPoint,radius:CGFloat,colors:[CGColor]){
self.center = center
self.radius = radius
self.colors = colors
super.init()
}
required init(coder aDecoder: NSCoder) {
super.init()
}
var center:CGPoint = CGPointMake(50,50)
var radius:CGFloat = 20
var colors:[CGColor] = [UIColor(red: 251/255, green: 237/255, blue: 33/255, alpha: 1.0).CGColor , UIColor(red: 251/255, green: 179/255, blue: 108/255, alpha: 1.0).CGColor]
override func drawInContext(ctx: CGContext!) {
CGContextSaveGState(ctx)
var colorSpace = CGColorSpaceCreateDeviceRGB()
var locations:[CGFloat] = [0.0, 1.0]
var gradient = CGGradientCreateWithColors(colorSpace, colors, [0.0,1.0])
var startPoint = CGPointMake(0, self.bounds.height)
var endPoint = CGPointMake(self.bounds.width, self.bounds.height)
CGContextDrawRadialGradient(ctx, gradient, center, 0.0, center, radius, 0)
}
}
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我只需要两种颜色,如果你需要更多的颜色,你需要修改location声明的数组drawInContext.在从这个类创建对象后,不要忘记调用它setNeedsDisplay()否则它将无法工作.有时候我需要不同的尺寸渐变,这就是为什么你必须在初始化器中传递radius参数和渐变的中心点
Kur*_*t J 20
如果您只是在寻找UIView径向渐变背景,那么这是Swift 3中的一个实现:
class RadialGradientLayer: CALayer {
var center: CGPoint {
return CGPoint(x: bounds.width/2, y: bounds.height/2)
}
var radius: CGFloat {
return (bounds.width + bounds.height)/2
}
var colors: [UIColor] = [UIColor.black, UIColor.lightGray] {
didSet {
setNeedsDisplay()
}
}
var cgColors: [CGColor] {
return colors.map({ (color) -> CGColor in
return color.cgColor
})
}
override init() {
super.init()
needsDisplayOnBoundsChange = true
}
required init(coder aDecoder: NSCoder) {
super.init()
}
override func draw(in ctx: CGContext) {
ctx.saveGState()
let colorSpace = CGColorSpaceCreateDeviceRGB()
let locations: [CGFloat] = [0.0, 1.0]
guard let gradient = CGGradient(colorsSpace: colorSpace, colors: cgColors as CFArray, locations: locations) else {
return
}
ctx.drawRadialGradient(gradient, startCenter: center, startRadius: 0.0, endCenter: center, endRadius: radius, options: CGGradientDrawingOptions(rawValue: 0))
}
}
class RadialGradientView: UIView {
private let gradientLayer = RadialGradientLayer()
var colors: [UIColor] {
get {
return gradientLayer.colors
}
set {
gradientLayer.colors = newValue
}
}
override func layoutSubviews() {
super.layoutSubviews()
if gradientLayer.superlayer == nil {
layer.insertSublayer(gradientLayer, at: 0)
}
gradientLayer.frame = bounds
}
}
Run Code Online (Sandbox Code Playgroud)
@IBDesignable class RadialGradientView: UIView {
@IBInspectable var outsideColor: UIColor = UIColor.red
@IBInspectable var insideColor: UIColor = UIColor.green
override func draw(_ rect: CGRect) {
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)
}
}
Run Code Online (Sandbox Code Playgroud)
在这里查看我的完整答案。
| 归档时间: |
|
| 查看次数: |
19846 次 |
| 最近记录: |