UIViewにオーバーレイするグラデーションエフェクトを作成するための簡単なカスタムCALayerがあります。ここでは、コードは次のようになります。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(レイヤーother:AnyObject)'が必要な理由を教えてください。 – Aaron
ドキュメントから:「この初期化子は、たとえば、presentationLayerメソッドのために、レイヤーのシャドウコピーを作成するために使用されます。 [...]カスタムレイヤーのサブクラスを実装する場合、このメソッドをオーバーライドしてインスタンス変数の値を新しいオブジェクトにコピーすることができます。 –