2012-04-03 9 views
27

私はナビゲーションコントローラ上でいくつかのカスタムアニメーションを行い、viewControllersをプッシュしてポップする方法を行っています。CALayer - 影がパフォーマンスヒット?

すべてがスムーズに実行されます。すぐに次のコード(サブクラスでUINavigationController)を追加すると、私は大きなパフォーマンスに直面します。影を追加すると、すべてのアニメーションが非常に遅くなります。これが期待されているのですか、コードで何か間違っていますか?

// This code gets called once during NavigationController initialization. 
[self.view setClipsToBounds:NO]; 
[self.view.layer setCornerRadius:5]; 
[self.view.layer setShadowOffset:CGSizeMake(0, 20)]; 
[self.view.layer setShadowColor:[[UIColor yellowColor] CGColor]]; 
[self.view.layer setShadowRadius:20.0]; 
[self.view.layer setShadowOpacity:1]; 

EDIT:

が1に自分の影の半径を変更し、それはまだ遅い

+0

、これはWWDC 2010セッション425に明示的に覆われている。実際にはCore Animationの、パート2 (https://developer.apple [こちら] .com/devcenter/download.action?path =/videos/wwdc_2010__sd/session_426__core_image_effects_and_optimization.mov) –

答えて

39

シャドウを追加するのが遅くなるはずです。 shadowRadiusは20で非常に高く、特に遅くなります。

シャドウのレンダリング速度を向上させるためのもう1つのキー:shadowPathプロパティを設定します。それは劇的に助けることができます。

+0

ShadowPathがトリックを設定しました。私のシャドウの半径は10であり、それでもうまくいきます。 – aryaxt

+0

ちょうど私の人生を救いました:) –

+2

@ NicolasManziniシャドーパフォーマンスのヒント:http://stackoverflow.com/questions/10133109/fastest-way-to-do-shadows-on-ios/10133182#10133182 – aryaxt

2

だはい、影のは、特に大きな影(非常に高価であり、 - 「半径と遊ぶとあなたあなたが経験する減速の程度には大きな違いがあります)。パフォーマンスを向上させる方法の1つは、一度CGImageContextにレンダリングし、再描画するたびにレイヤーを再描画するのではなく、そのイメージを表示することです(ただし、シャドウをアニメーション化する必要がある場合は機能しません)。

+0

実際のPNGを使用してUIViewに追加する方が良いと思いますか? – aryaxt

+0

それは可能性がある(つまり、シェイプ/サイズ/それ以前にシャドーが分かっていれば)、それは間違いなくより良いパフォーマンスを与えるでしょう。イメージのブリッティングは、シャドウのレンダリングよりもはるかに高速です。 –

+0

画像にあらかじめレンダリングされているのは、影の形状を変更する必要がない限り有効です。 –

79
self.view.layer.shouldRasterize = YES; 
self.view.layer.rasterizationScale = UIScreen.mainScreen.scale; 

私は最近、遅いCALayerシャドウでいくつかの問題を抱えていました。

+0

awesome、これはさらに優れたパフォーマンスを発揮し、パフォーマンスが低下することなくshadowRadiusのサイズを変更することができます – aryaxt

+21

注釈のために持っている網膜画像は無視されます。これを修正するには、次の行を追加します:self.view.layer.rasterizationScale = [UIScreen mainScreen]。規模; – Sean

+2

私は同様の問題は、各セルにいくつかのUILabelsだけでなく、角を丸くしたビューが含まれてtableViewとしている。私は、tableViewを含む層に影を追加し、スクロールが不安定になります。しかし、shouldRasterize = YESを設定すると、うまさが解決されましたが、視覚的にぼやけて見えるようにピクセル化されました。 shadowOffsetの代わりにshadowPathを使っているのが分かりました。 –

13

shadowOffsetの代わりにshadowPathを使用します。

theView.layer.shadowPath = [UIBezierPath bezierPathWithRect:theView.bounds].CGPath; 

チェックこの記事:それは価値があるすべてのためにiphone - Animation's performance is very poor when view's shadow is on

+0

ビューやすべてのサブレイヤをぼかすshouldRasterizeよりも優れています。 –

+1

それは非常に効率的な方法で私はテストする必要がありますようにすばやくないshouldRasterizeの仕事とアイデア...この答えははるかに良い!なぜ@williamcottonの答えが非常に多くの票を得ているのか分かりません... –

+0

shadowPathはかなり良いと速いですが、どうやってautolayoutで更新フレームを維持できますか? – TomSawyer