У меня есть простой пользовательский CALayer, чтобы создать эффект наложения градиента на моем UIView. Вот код:Подслои слоя UIView отображаются по-разному/случайным образом, каждый раз появляется вид
class GradientLayer: CALayer {
var locations: [CGFloat]?
var origin: CGPoint?
var radius: CGFloat?
var color: CGColor?
convenience init(view: UIView, locations: [CGFloat]?, origin: CGPoint?, radius: CGFloat?, color: UIColor?) {
self.init()
self.locations = locations
self.origin = origin
self.radius = radius
self.color = color?.CGColor
self.frame = view.bounds
}
override func drawInContext(ctx: CGContext) {
super.drawInContext(ctx)
guard let locations = self.locations else { return }
guard let origin = self.origin else { return }
guard let radius = self.radius else { return }
let colorSpace = CGColorGetColorSpace(color)
let colorComponents = CGColorGetComponents(color)
let gradient = CGGradientCreateWithColorComponents(colorSpace, colorComponents, locations, locations.count)
CGContextDrawRadialGradient(ctx, gradient, origin, CGFloat(0), origin, radius, [.DrawsAfterEndLocation])
}
}
Я инициализировать и установить эти слои здесь:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
let gradient1 = GradientLayer(view: view, locations: [0.0,1.0], origin: CGPoint(x: view.frame.midX, y: view.frame.midY), radius: 100.0, color: UIColor(white: 1.0, alpha: 0.2))
let gradient2 = GradientLayer(view: view, locations: [0.0,1.0], origin: CGPoint(x: view.frame.midX-20, y: view.frame.midY+20), radius: 160.0, color: UIColor(white: 1.0, alpha: 0.2))
let gradient3 = GradientLayer(view: view, locations: [0.0,1.0], origin: CGPoint(x: view.frame.midX+30, y: view.frame.midY-30), radius: 300.0, color: UIColor(white: 1.0, alpha: 0.2))
gradient1.setNeedsDisplay()
gradient2.setNeedsDisplay()
gradient3.setNeedsDisplay()
view.layer.addSublayer(gradient1)
view.layer.addSublayer(gradient2)
view.layer.addSublayer(gradient3)
}
мнение кажется отображались правильно большую часть времени, но (на первый взгляд) случайным образом я буду получать различные визуализаций как вы увидите ниже. Вот некоторые примеры (первый из них является то, что я хочу):
Что является причиной этой неисправности? Как загружать первый раз каждый раз?
Не могли бы вы объяснить, для чего нужен 'init (layer other: AnyObject)'? – Aaron
Из документации: «Этот инициализатор используется для создания теневых копий слоев, например, для метода« presentationLayer ». [...] Если вы реализуете подклассы пользовательского уровня, вы можете переопределить этот метод и использовать его для копирования значений переменных экземпляра в новый объект ». –