その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

CALayer を用いた「影」の描画処理を軽くする

CALayerを用いてUIViewを継承したクラスに影をつける方法は、下記のような感じで(CoreGraphicsで描画する方法などと比べて)わかりやすくお手軽で、質感もグッと増すので、ついつい多用したくなります。

self.layer.shadowOpacity = 0.5;
self.layer.shadowRadius = 2.0;
self.layer.shadowOffset = CGSizeMake(0.0, 0.0);


ただ、影とか透過とかの処理はなかなか重いらしく、例えば UITableViewCell に置いた背景用画像に影をつけると、iPhone4ぐらいでも完全に体感できるぐらいに遅くなってしまいます。


で、このコードに下記の3行を付け加えてやると、体感でわかるぐらいに改善されます。

self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = [UIScreen mainScreen].scale;


shadowPath で、影をつける矩形のパスをあらかじめ与えてやり、shouldRasterize を YES にして rasterizationScale をセットしてやることで、ビットマップとしてプリレンダリングされるらしいです。
(※本家ドキュメント未確認です)


(参考ページ)
http://stackoverflow.com/questions/8333736/uitableview-lagging-due-to-shadows-and-borders