我制作了一个增加了 CATextLayer
的 CALayer
,文字变得模糊不清。在文档中,他们谈到“亚像素反锯齿”,但这对我来说没有太大意义。有人有一个代码片段,使一个 CATextLayer
与一个位的文本是明确的?
以下是苹果公司文档中的内容:
注意: CATextLayer 在渲染文本时禁用子像素反走样。 文本只能使用子像素反锯齿绘制时,它是 合成到一个现有的不透明背景,同时 它是光栅化的。没有办法绘制亚像素反锯齿文本 本身,无论是进入一个图像或图层,分别提前 具有背景像素以将文本像素编织成。设置 图层的不透明度属性设置为 YES 不会改变渲染效果 模式。
第二句意味着,如果一个 composites
它成为一个 existing opaque background at the same time that it's rasterized.
这是伟大的,但我如何合成它,你如何给它一个不透明的背景,你如何光栅化它好看的文本?
他们在 Kiosk Menu 示例中使用的代码是这样的: (它是 OSX,不是 iOS,但我假设它可以工作!)
NSInteger i;
for (i=0;i<[names count];i++) {
CATextLayer *menuItemLayer=[CATextLayer layer];
menuItemLayer.string=[self.names objectAtIndex:i];
menuItemLayer.font=@"Lucida-Grande";
menuItemLayer.fontSize=fontSize;
menuItemLayer.foregroundColor=whiteColor;
[menuItemLayer addConstraint:[CAConstraint
constraintWithAttribute:kCAConstraintMaxY
relativeTo:@"superlayer"
attribute:kCAConstraintMaxY
offset:-(i*height+spacing+initialOffset)]];
[menuItemLayer addConstraint:[CAConstraint
constraintWithAttribute:kCAConstraintMidX
relativeTo:@"superlayer"
attribute:kCAConstraintMidX]];
[self.menuLayer addSublayer:menuItemLayer];
} // end of for loop
谢谢!
编辑: 添加我实际使用的代码,导致文本模糊。这是从一个相关的问题,我发布了关于添加一个 UILabel
而不是一个 CATextLayer
,但得到一个黑盒子代替。http://stackoverflow.com/questions/3818676/adding-a-uilabels-layer-to-a-calayer-and-it-just-shows-black-box
CATextLayer* upperOperator = [[CATextLayer alloc] init];
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGFloat components1[4] = {1.0, 1.0, 1.0, 1.0};
CGColorRef almostWhite = CGColorCreate(space,components1);
CGFloat components2[4] = {0.0, 0.0, 0.0, 1.0};
CGColorRef almostBlack = CGColorCreate(space,components2);
CGColorSpaceRelease(space);
upperOperator.string = [NSString stringWithFormat:@"13"];
upperOperator.bounds = CGRectMake(0, 0, 100, 50);
upperOperator.foregroundColor = almostBlack;
upperOperator.backgroundColor = almostWhite;
upperOperator.position = CGPointMake(50.0, 25.0);
upperOperator.font = @"Helvetica-Bold";
upperOperator.fontSize = 48.0f;
upperOperator.borderColor = [UIColor redColor].CGColor;
upperOperator.borderWidth = 1;
upperOperator.alignmentMode = kCAAlignmentCenter;
[card addSublayer:upperOperator];
[upperOperator release];
CGColorRelease(almostWhite);
CGColorRelease(almostBlack);
编辑2: 请看下面我的答案,了解这个问题是如何解决的。