我在使用 CATextLayer 时遇到了一些问题,这可能是我自己造成的,但我没有找到关于这个主题的任何帮助。我在 OS X 上(在 iOS 上应该是一样的)。
我创建了一个比例因子 > 1 的 CATextLayer 图层,我得到的是一个模糊的文本。我认为,在应用比例之前,图层会被栅格化。这是预期的行为吗?我希望不是,因为它没有任何意义...... CAShapeLayer 在应用它的变换矩阵之后被光栅化,为什么 CATextLayer 应该不同?
万一我做错了什么……那是什么?
CATextLayer *layer = [CATextLayer layer];
layer.string = @"I like what I am doing";
layer.font = (__bridge CFTypeRef)[NSFont systemFontOfSize:24];
layer.fontSize = 24;
layer.anchorPoint = CGPointZero;
layer.frame = CGRectMake(0, 0, 400, 100);
layer.foregroundColor = [NSColor blackColor].CGColor;
layer.transform = CATransform3DMakeScale(2., 2., 1.);
layer.shouldRasterize = NO;
[self.layer addSublayer:layer];
我目前使用的解决方案是将图层的 contentsScale 属性设置为比例因子。问题是这个解决方案不能缩放:如果任何父层的缩放因子发生变化,那么 contentsScale 也应该更新。我应该编写代码来遍历图层树以更新所有 CATextLayers 的 contentsScale 属性......这不完全是我想做的。
另一种解决方案(不是真正的解决方案)是将文本转换为形状并使用 CAShapeLayer。但后来我看不出拥有 CATextLayers 的意义。
CALayer 的自定义子类可以帮助解决这个问题吗?
编辑:甚至 CAGradientLayer 也能够渲染其内容,如 CAShapeLayer,之后应用其变换矩阵。有人可以解释这是怎么可能的吗?
编辑 2:我的猜测是路径和渐变被渲染为 OpenGL 显示列表,因此它们由 OpenGL 本身以屏幕上的实际大小进行光栅化。文本由 Core Animation 光栅化,因此它们是 OpenGL 的位图。
我想我现在会使用 contentsScale 解决方案。也许,在未来,我会将文本转换为形状。为了通过少量工作获得最佳结果,这是我现在使用的代码:
[CATransaction setDisableActions:YES];
CGFloat contentsScale = ceilf(scaleOfParentLayer);
// _scalableTextLayer is a CATextLayer
_scalableTextLayer.contentsScale = contentsScale;
[_scalableTextLayer displayIfNeeded];
[CATransaction setDisableActions:NO];