2

棒グラフに小さな点を描くために使用している CAShapeLayer があります。問題は、Retina ディスプレイではすべてが大きすぎることです。contentsScale を設定し、設定されていることを確認しました。それでも、あってもなくても違いはわかりません!

CAShapeLayer *lineShapeLayer = [CAShapeLayer layer];
lineShapeLayer.contentsScale = [[UIScreen mainScreen] scale]; 
CGMutablePathRef path = CGPathCreateMutable();
lineShapeLayer.backgroundColor = [UIColor clearColor].CGColor;
lineShapeLayer.bounds = CGRectMake(0, 0, self.backgroundLayer.bounds.size.width, 1.5);

lineShapeLayer.anchorPoint = CGPointMake(0, 0);
lineShapeLayer.position = CGPointMake(0, rint((self.verticalPartitionHeight)*i));
lineShapeLayer.lineDashPattern = [NSArray arrayWithObjects:[NSNumber numberWithFloat:1], [NSNumber numberWithInt:2], nil];
lineShapeLayer.strokeColor = [UIColor blackColor].CGColor;
lineShapeLayer.lineWidth = 1;
NSLog(@"contentsScale: %f", lineShapeLayer.contentsScale);

CGPathMoveToPoint(path, nil, 0, .5);       
CGPathAddLineToPoint(path, nil, lineShapeLayer.frame.size.width, .5);
[lineShapeLayer setPath:path];

[self.backgroundLayer addSublayer:lineShapeLayer];

PNGで作成した場合のビューは次のとおりです。 1px ドットを示す PNG

CAShapeLayer コードを含むビューを次に示します (線幅を 0.5 に設定)。 4px ドットを示す CAShapeLayer :(

4

3 に答える 3

4

他の場所でない限り、コードに問題はありません。i上記のコードをループ内で実行しました(インデックスであると想定しています) self.verticalPartitionHeight = 30.0.

下の 2 つの画像は、通常の解像度と Retina 解像度の両方での結果です。通常の画像を拡大して同じサイズにしました。ご覧のとおり、ドットは両方の解像度で同じサイズ (ピクセルではなくポイント) です。

通常の解像度、2 倍に拡大

網膜解像度

編集:

Stocks アプリはランドスケープでこれを行うと述べていますが、スクリーンショットを拡大すると、実際にポイントを使用していることがわかります (すべてのドットが 2x2 ピクセルであるため)。下のスクリーンショット (Retina スクリーンショットから) でこれを見ることができます。ここでは、ドットを大きく拡大し、1 つのドットの 1 つのピクセルを選択しています。

これ予期される動作です。

Stocks.app ドット

編集2:

あなたのドットをもう一度ズームアップして見てください。実際には、Apples Stocks アプリのドットとまったく同じサイズです。1 つのピクセルを選択した下の画像で確認できます。

ここに画像の説明を入力

于 2012-05-25T22:40:39.840 に答える
0

@David Ronnqvistは正しかった!contentsScaleは機能していました。線幅をさらに小さくして、全体を.25(.5 / 2)に配置する必要がありました。

    CAShapeLayer *lineShapeLayer = [CAShapeLayer layer];
    lineShapeLayer.contentsScale=[[UIScreen mainScreen] scale]; 
    CGMutablePathRef path = CGPathCreateMutable();
    lineShapeLayer.backgroundColor=[UIColor clearColor].CGColor;
    lineShapeLayer.bounds=CGRectMake(0, 0, self.backgroundLayer.bounds.size.width, 0.5);

    lineShapeLayer.anchorPoint=P(0,0);
    lineShapeLayer.position=P(0,rint((self.verticalPartitionHeight)*i));
    lineShapeLayer.lineDashPattern=[NSArray arrayWithObjects:[NSNumber numberWithFloat:0.5], [NSNumber numberWithInt:1], nil];
    lineShapeLayer.strokeColor=[UIColor grayColor].CGColor;
    lineShapeLayer.lineWidth=0.5;
    lineShapeLayer.shadowColor=[UIColor whiteColor].CGColor;
    lineShapeLayer.shadowOffset=CGSizeMake(0, 0.5);
    lineShapeLayer.shadowOpacity=1.0;
    lineShapeLayer.shadowRadius=0;


    NSLog(@"lineShapeLayer.frame: %@", NSStringFromCGRect(lineShapeLayer.frame));
    CGPathMoveToPoint(path, nil, 0, 0.25);       
    CGPathAddLineToPoint(path, nil, lineShapeLayer.frame.size.width, 0.25);
    [lineShapeLayer setPath:path];

もちろん、これをスケール用にハードコーディングするのではなく、スケールで割り切れるようにします。

完璧に見えます

于 2012-05-27T02:25:30.170 に答える
0

スケーリングする最良の方法CAShapeLayerは次のとおりです。

CAShapeLayer *pathLayer = [CAShapeLayer layer];   
[pathLayer setTransform:CATransform3DMakeScale(0.1, 0.1, 0.1)];
于 2013-05-01T05:59:25.183 に答える