我有一个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制作的视图:
以下是带有CAShapeLayer代码的视图(设置为线宽.5均匀。):
答案 0 :(得分:4)
您的代码除非在其他地方,否则没有任何问题。我使用i
在循环中运行上面的代码(我假设self.verticalPartitionHeight = 30.0
是索引)。
以下两张图片是正常分辨率和视网膜分辨率的结果。我扩大了正常的图像,使它们的大小相同。正如您所看到的,两个分辨率上的点都是相同的大小(以点为单位,而不是像素)。
你提到Stocks应用程序在Landscape中执行此操作,但如果你放大它的屏幕截图,你会发现它实际上使用了点(因为每个点都是2x2像素)。您可以在下面的屏幕截图中看到这一点(来自视网膜截图),我在这里点了很多点并选择了一个点的一个像素。
此是预期的行为。
再一次放大看看你的圆点。它们实际上与苹果股票应用程序中的点完全相同的大小。您可以在下面的图片中看到它,我选择了一个像素。
答案 1 :(得分:0)
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];
当然,我会把这不是硬编码的比例,但可以按比例整除。
答案 2 :(得分:0)
扩展CAShapeLayer
的最佳方法如下:
CAShapeLayer *pathLayer = [CAShapeLayer layer];
[pathLayer setTransform:CATransform3DMakeScale(0.1, 0.1, 0.1)];