AutolayoutしているUIVIewにグラデーションを指定する

qiita.com

はい。普通にぐぐると↑にたどり着くのですが、frameを使っているため普通に処理を書くとAutolayoutの制約の処理が終わっておらず、うまくグラデーションになりません。かなしい。

じゃあAutolayoutの制約の適用が完了した後にグラデーションの設定をすればいい、ってことで下記のようにしたら一応動きました。

override func drawRect(rect: CGRect) {
    super.drawRect(rect)
    let gradientLayer: CAGradientLayer = CAGradientLayer()
    gradientLayer.colors = [
        UIColor.clearColor().CGColor,
        UIColor.blackColor().CGColor
    ]
    gradientLayer.locations = nil
    gradientLayer.frame = itemImageInnserShadow.bounds
    targetView.layer.insertSublayer(gradientLayer, atIndex: 0)
}

drawRectの中だったらsuper.drawRect(rect)を呼び出す前でも後でも制約の適応は完了していたのでそこにグラデーションの設定のコードを記述しました。今回は親Viewの中にグラデーションで塗りつぶしたグラデviewをAutolayoutでサイズを指定して親view.addSubview(グラデview) をしたかった。

でもグラデーションにしたいUIViewのクラスを作ってそのdrawRect内に書くのがすっきり書けそう。その際は グラデview.contentMode = .Redraw しておくとよさそうなのでメモっておく。

gradientLayer.locationsに関しては Cocoaの日々: [iOS][Mac] Core Graphics - グラデーション が参考になった。