19

CALayer のデリゲート メソッドでグラフを描画していますdrawLayer:inContext:

最新のデバイスではグラフがぼやけて見えるため、Retina ディスプレイをサポートしたいと考えています。

CALayer から渡されたグラフィックス コンテキストに直接描画する部分については、CALayer の contentScale プロパティを次のように設定することで、高解像度で適切に描画できました。

if ([myLayer respondsToSelector:@selector(setContentsScale:)]) {
    myLayer.contentsScale = [[UIScreen mainScreen] scale];
}

しかし、CGLayer を使用した部分はまだぼやけて描かれています。

Retina ディスプレイをサポートするために CGLayer に高解像度で描画するにはどうすればよいですか?

CGLayer を使用して、グラフの同じプロット形状を繰り返し描画したり、レイヤーの端を超えるグラフ線を切り取ったりしたいと考えています。

CALayer から渡されたグラフィックス コンテキストを使用してCGLayer を取得し、やCGLayerCreateWithContexなどの CG 関数を使用してそのコンテキストに描画します。CGContextFillPathCGContextAddLineToPoint

iOS 4.x と iOS 3.1.3 の両方、Retina とレガシー ディスプレイの両方をサポートする必要があります。

ありがとう、

くら

4

2 に答える 2

28

これは、すべての解像度で CGLayer を正しく描画する方法です。

  1. レイヤーを最初に作成するときは、寸法にスケールを掛けて正しい境界を計算する必要があります。

    int width = 25; 
    int height = 25;
    float scale = [self contentScaleFactor];
    CGRect bounds = CGRectMake(0, 0, width * scale, height * scale);
    CGLayer layer = CGLayerCreateWithContext(context, bounds.size, NULL);
    CGContextRef layerContext = CGLayerGetContext(layer);
    
  2. 次に、レイヤー コンテキストに適切なスケールを設定する必要があります。

    CGContextScaleCTM(layerContext, scale, scale);
    
  3. 現在のデバイスに Retina ディスプレイがある場合、レイヤーに作成されたすべての描画は 2 倍の大きさで描画されます。

  4. 最終的にレイヤーのコンテンツを描画するときは、必ず CGContextDrawLayerInRect を使用し、スケーリングされていない CGRect を指定してください。

    CGRect bounds = CGRectMake(0, 0, width, height);
    CGContextDrawLayerInRect(context, bounds, layerContext);
    

それでおしまい!

于 2012-01-05T12:03:16.880 に答える
1

CGLayer を使用せず、CALayer のグラフィックス コンテキストに直接描画することにしました。今では Retina ディスプレイで高解像度できれいに描画されます。

ここで同様の質問を見つけましたが、私の場合は CGLayer を使用する意味がないことがわかりました。

Quartz 2D プログラミング ガイドにある Apple のサンプル プログラム「Using Multiple CGLayer Objects to Draw a Flag」のために CGLayer を使用しました。この例では、1 つの星に対して 1 つの CGLayer を作成し、それを複数回使用して 50 個の星を描画します。これはパフォーマンス上の理由だと思いましたが、パフォーマンスの違いは見られませんでした。

レイヤーの端を超えるグラフ線を切り取るために、複数の CALayer を使用することにしました。

于 2011-07-20T14:39:05.693 に答える