37

QuartzCore .layer.shadow の吸い上げ性能。何かが変更されるたびに再レンダリングする必要があるようで、すべてが遅れます。

Coregraphics グラデーション (一方向の影用) - 正しく見えません。グラデーションが 0.3 アルファから 0 になると、グラデーションが「見える」という奇妙な効果があります。見た目が良くない、または自然に見えないだけです。ディザリングされていないのかもしれませんが、コア グラフィックスのグラデーションはディザリングされていると聞いたことがあります。変ですよね、わかりません。

Coregraphics シャドウ - 設定したとおりにレンダリングするのに時間がかかりますが、それ以外は優れたパフォーマンスです。最初に影をレンダリングする必要があるため、ビューが表示されるのを待っているのはその瞬間です。それが問題です。

だから私は何かが欠けているに違いない。適切に見え、レンダリング時間とパフォーマンスの両方で高速な別の方法はありますか?

4

2 に答える 2

10

パフォーマンスに大きな影響を与えるビューのレイヤーを使用して、丸みを帯びた角やドロップシャドウを作成している人をよく見かけます。このようなもの:

[v.layer setCornerRadius:30.0f];
[v.layer setBorderColor:[UIColor lightGrayColor].CGColor];
[v.layer setBorderWidth:1.5f];
[v.layer setShadowColor:[UIColor blackColor].CGColor];
[v.layer setShadowOpacity:0.8];
[v.layer setShadowRadius:3.0];
[v.layer setShadowOffset:CGSizeMake(2.0, 2.0)];
.....

これは、特にの場合に、パフォーマンスに大きな影響を与えます。このようなビューを UITableView (または実際に動くもの) に配置すると、Android 風のスクロール エクスペリエンスが作成されますが、それは望ましくありません。ビューをアニメーション化または移動する必要がある場合は、角を丸くしたり、このようなドロップ シャドウを作成したりしないでください。

コア グラフィックス
の紹介 単純な UIView サブクラスを作成して、同じ結果をわずかに異なる方法で実現する方法を示しました。Core Graphics を使用してビューを描画します。上記のコードとは対照的に、パフォーマンスには影響しません。

描画コードは次のとおりです。

- (void)drawRect:(CGRect)rect
{
   CGContextRef ref = UIGraphicsGetCurrentContext();

  /* We can only draw inside our view, so we need to inset the actual 'rounded content' */
  CGRect contentRect = CGRectInset(rect, _shadowRadius, _shadowRadius);

  /* Create the rounded path and fill it */
  UIBezierPath *roundedPath = [UIBezierPath bezierPathWithRoundedRect:contentRect cornerRadius:_cornerRadius];
  CGContextSetFillColorWithColor(ref, _fillColor.CGColor);
  CGContextSetShadowWithColor(ref, CGSizeMake(0.0, 0.0), _shadowRadius, _shadowColor.CGColor);
  [roundedPath fill];

  /* Draw a subtle white line at the top of the view */
  [roundedPath addClip];
  CGContextSetStrokeColorWithColor(ref, [UIColor colorWithWhite:1.0 alpha:0.6].CGColor);
  CGContextSetBlendMode(ref, kCGBlendModeOverlay);

  CGContextMoveToPoint(ref, CGRectGetMinX(contentRect), CGRectGetMinY(contentRect)+0.5);
  CGContextAddLineToPoint(ref, CGRectGetMaxX(contentRect),   CGRectGetMinY(contentRect)+0.5);
  CGContextStrokePath(ref);
 }

このブログを参照してください: http://damir.me/rounded-uiview-with-shadow-the-right-way

于 2014-08-21T09:54:12.443 に答える