尽管设置了contentsScale,为什么CAShapeLayer太大了?

时间:2012-05-25 19:24:09

标签: iphone ios core-animation

我有一个CAShapeLayer,我用它在条形图中绘制小点。问题是它们在视网膜显示器上都太大了。我已设置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制作的视图: PNGs showing 1px dots

以下是带有CAShapeLayer代码的视图(设置为线宽.5均匀。): CAShapeLayer showing 4px dots :(

3 个答案:

答案 0 :(得分:4)

您的代码除非在其他地方,否则没有任何问题。我使用i在循环中运行上面的代码(我假设self.verticalPartitionHeight = 30.0是索引)。

以下两张图片是正常分辨率和视网膜分辨率的结果。我扩大了正常的图像,使它们的大小相同。正如您所看到的,两个分辨率上的点都是相同的大小(以点为单位,而不是像素)。

Normal resolution, scaled up two times

Retina resolution

编辑:

你提到Stocks应用程序在Landscape中执行此操作,但如果你放大它的屏幕截图,你会发现它实际上使用了点(因为每个点都是2x2像素)。您可以在下面的屏幕截图中看到这一点(来自视网膜截图),我在这里点了很多点并选择了一个点的一个像素。

预期的行为。

Stocks.app dots

编辑2:

再一次放大看看你的圆点。它们实际上与苹果股票应用程序中的点完全相同的大小。您可以在下面的图片中看到它,我选择了一个像素。

enter image description here

答案 1 :(得分: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];

当然,我会把这不是硬编码的比例,但可以按比例整除。

Looks perfect

答案 2 :(得分:0)

扩展CAShapeLayer的最佳方法如下:

CAShapeLayer *pathLayer = [CAShapeLayer layer];   
[pathLayer setTransform:CATransform3DMakeScale(0.1, 0.1, 0.1)];