0

我有一个 CALayer,在其最终尺寸上画了一个圆圈。我想为圆圈设置动画,使其以 1% 的比例开始并以 100% 的比例结束。现在动画不是很平滑,因为在缩放时边缘会闪烁。在最终尺寸下,圆圈看起来是正确的。我想知道是否有办法在动画本身期间进行抗锯齿。

CATransform3D fromTransform = CATransform3DMakeScale(0.01, 0.01, 1.0);
CATransform3D toTransform = CATransform3DMakeScale(1.0, 1.0, 1.0);

CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
theAnimation.duration = 1.5;
theAnimation.fromValue = [NSValue valueWithCATransform3D:fromTransform];
theAnimation.toValue = [NSValue valueWithCATransform3D:toTransform]; 

[myLayer addAnimation:theAnimation forKey:@"animateScale"];
4

2 回答 2

2

我认为没有办法改变图层的缩放方式。但是,您可以通过将多个分辨率的圆圈渲染到不同大小的图层并同时为它们设置动画来获得更好的结果——逐渐缩放和淡入/淡出更大的图层,直到您到达最终的全尺寸图层。

您也可以尝试直接逐帧绘制圆,而不是为图层大小设置动画——如果绘制速度足够快,您将保持良好的帧速率,并且不会出现任何缩放伪影。如果您选择此路径,通常最好在专用于此动画的单独线程上执行此操作,而不是使用主线程。

在类似的情况下,我通常最终只是柔化了我绘图的边缘——一个精心挑选的阴影或光晕可以很好地减少锯齿伪影,而且它比任何其他解决方案都简单得多。(另请注意,圆圈的笔画宽度随图层缩放:如果您在黑色背景上使用全尺寸的 1 像素线宽绘制一个白色圆圈,那么在 1% 时,线条将只有 0.01 像素宽!​​)

于 2010-07-24T18:44:47.887 回答
0

方法:使用layer.shouldRasterize

  1. 创建一个在所有 4 个方向上都大 1 像素的superlayer/superview
  2. superlayer/上进行转换superview
  3. layer.shouldRasterize在原始layer/上启用view

方法:绘制到UIImage

  • 将您的内容绘制到 UIImage
  • 确保内容周围有 1 个像素的透明边框
  • 显示图像

参考:http ://darknoon.com/2012/05/18/the-transparent-border-trick/

于 2014-08-20T16:15:25.040 回答