🎨
グラデーションされたレイヤを挿入するのではなく、レイヤをグラデーションする
はじめに
UIViewにグラデーションをつけるときに
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [UIColor.red.cgColor,
UIColor.blue.cgColor]
view.layer.insertSublayer(gradientLayer, at: 0)
のようにして描く方法が検索するとヒットします。これは、グラデーションが作成できるレイヤーを定義して、layerの上にそれを乗せるという流れです。しかし、本来UIViewが持っているlayerをグラデーションする方が方法としては素直ではないかと思ったのでやってみました。
また、以下のような言葉があるようです。
underlying layer:UIViewがデフォルトでもつCALayer型のプロパティ
stand alone layer:親として対応するUIViewがないCALayer
つまり、この記事の内容をまとめると「グラデーションが施されたstand alone layerを挿入するのではなくて、underlying layerをグラデーションさせることでグラデーションを表現した」ということになります。
layerの型を変えたカスタムUIViewを作る
UIView.layerはget-onlyなプロパティであるため、グラデーションさせたいViewにはカスタムUIViewを利用する,カスタムUIViewの中でlayerClass
をoverrideするというアプローチを取ります。
class GradientView: UIView {
override class var layerClass: AnyClass {
return CAGradientLayer.self
}
}
グラデーションさせたいViewをキャストして利用する
GradientView
型のsomeView
をstoryboardで貼り付け、viewDidLoad
内で以下の処理を行います。
if let layer = someView.layer as? CAGradientLayer {
layer.colors = [UIColor.red.cgColor,
UIColor.blue.cgColor]
}
すると、期待した通りlayerをグラデーションさせることができました。
参考
Discussion