iPhone动画:如何反别名?

时间:2009-10-14 08:21:33

标签: iphone core-animation antialiasing

我在我的iPhone应用程序中查看了一些动画,感觉它有点难看。然后我继续说道:它只是没有动画通过亚像素状态。

所以,如果我使用通常的+ beginAnimations / + commitAnimations,移动一些东西只是几个像素看起来“跳跃”。我怎么能避免呢?是否有任何标志可以通过浮动坐标或其他任何东西制作动画?

只是为了让您知道我拥有什么以及我在寻找什么,请参考图片:

alt text http://www.ptoing.net/subpixel_aa.gif

提前致谢, 安东

3 个答案:

答案 0 :(得分:7)

这很有趣,但我发现UIImageView使用 aniti-aliasing为其内容设置动画,而视图的边缘不会消除锯齿(硬)。这似乎是因为UIView本身应该保持相同的边界,而子像素渲染可能会添加到边界。

所以,我最后只是在图片周围放置一个带有透明空间的图像,一切顺利。

不要让UIView为你剪掉它的内容:)

答案 1 :(得分:1)

您可以尝试从覆盖其drawRect方法的自定义UIView派生您正在设置动画的项目,并为其设置消除锯齿,然后让父绘制到其中。有点像:

- (void) drawRect:(CGRect)area
{
  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSaveGState(context);
  CGContextSetShouldAntialias(context, true);
  CGContextSetAllowsAntialiasing(context, true);
  [super drawRect:area];
  // We have to turn it back off since it's not saved in graphic state.
  CGContextSetAllowsAntialiasing(context, false);
  CGContextRestoreGState(context);
}

另一方面,到达此处时渲染管道可能为时已晚,因此您可能必须最终滚动自己的动画方案,以便完全控制像素定位。

答案 2 :(得分:0)

Per Jeeva上面的评论,你可以通过将info.plist中的以下选项设置为YES,使用抗锯齿渲染UIView边缘。

Renders with edge antialiasing

以下是Jeeva指出的链接:

http://www.techpaa.com/2012/06/avoiding-view-edge-antialiasing.html