Swift - 如何创建非像素化径向渐变?
Swift - how to create a non-pixelated radial gradient?
我正在尝试为我的应用程序创建径向/圆形渐变。
我使用了类似于确认答案的解决方案
但是,生成的渐变看起来像素化。
我做错了什么?是否有更现代的方式或良好的第 3 方框架来创建平滑、简单的径向渐变?
谢谢!
我的代码(基于 Stack Overflow 上发布的代码片段):
class RadialGradientLayer: CALayer {
init(innerColor: UIColor, outerColor: UIColor) {
self.innerColor = innerColor.CGColor
self.outerColor = outerColor.CGColor
super.init()
needsDisplayOnBoundsChange = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("This class does not support NSCoding")
}
var innerColor: CGColor
var outerColor: CGColor
override func drawInContext(ctx: CGContext) {
CGContextSaveGState(ctx)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let locations:[CGFloat] = [0.0, 1.0]
let colors = [innerColor, outerColor]
let gradient = CGGradientCreateWithColors(colorSpace, colors, locations)
let center = CGPoint(x: bounds.width / 2.0, y: bounds.height / 2.0)
let radius = min(bounds.width / 2.0, bounds.height / 2.0)
CGContextDrawRadialGradient(ctx, gradient, center, 0.0, center, radius, CGGradientDrawingOptions(rawValue: 0))
}
}
您需要确保 CGContext
已针对设备屏幕进行缩放。
看看这个问题的答案 - CGContext and retina display
这将帮助您解决问题。
我正在尝试为我的应用程序创建径向/圆形渐变。
我使用了类似于确认答案的解决方案
但是,生成的渐变看起来像素化。
我做错了什么?是否有更现代的方式或良好的第 3 方框架来创建平滑、简单的径向渐变?
谢谢!
我的代码(基于 Stack Overflow 上发布的代码片段):
class RadialGradientLayer: CALayer {
init(innerColor: UIColor, outerColor: UIColor) {
self.innerColor = innerColor.CGColor
self.outerColor = outerColor.CGColor
super.init()
needsDisplayOnBoundsChange = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("This class does not support NSCoding")
}
var innerColor: CGColor
var outerColor: CGColor
override func drawInContext(ctx: CGContext) {
CGContextSaveGState(ctx)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let locations:[CGFloat] = [0.0, 1.0]
let colors = [innerColor, outerColor]
let gradient = CGGradientCreateWithColors(colorSpace, colors, locations)
let center = CGPoint(x: bounds.width / 2.0, y: bounds.height / 2.0)
let radius = min(bounds.width / 2.0, bounds.height / 2.0)
CGContextDrawRadialGradient(ctx, gradient, center, 0.0, center, radius, CGGradientDrawingOptions(rawValue: 0))
}
}
您需要确保 CGContext
已针对设备屏幕进行缩放。
看看这个问题的答案 - CGContext and retina display
这将帮助您解决问题。