我正在查看我的 iPhone 应用程序中的一些动画,感觉有点难看。然后我明白了:它只是不通过亚像素状态进行动画处理。
所以,如果我使用通常的 +beginAnimations/+commitAnimations,移动一些只有几个像素的东西看起来“跳跃”。我怎样才能避免它?是否有任何标志可以通过浮动坐标或其他方式使其动画?
只是为了让您了解我拥有什么以及我在寻找什么,请参考图片:
替代文字 http://www.ptoing.net/subpixel_aa.gif
提前致谢, 安东
我正在查看我的 iPhone 应用程序中的一些动画,感觉有点难看。然后我明白了:它只是不通过亚像素状态进行动画处理。
所以,如果我使用通常的 +beginAnimations/+commitAnimations,移动一些只有几个像素的东西看起来“跳跃”。我怎样才能避免它?是否有任何标志可以通过浮动坐标或其他方式使其动画?
只是为了让您了解我拥有什么以及我在寻找什么,请参考图片:
替代文字 http://www.ptoing.net/subpixel_aa.gif
提前致谢, 安东
这很有趣,但我发现 UIImageView使用抗锯齿对其内容进行动画处理,而视图的边缘没有抗锯齿(硬)。这似乎是因为 UIView 本身应该保持相同的边界,而亚像素渲染可能会增加一点边界。
所以,我最终只是在图片周围放置了一个带有一些透明空间的图像,一切都很顺利。
只是不要让 UIView 为你剪切它的内容:)
您可以尝试从自定义 UIView 派生您正在制作动画的项目,该 UIView 会覆盖其drawRect
方法并为其设置抗锯齿,然后让父级绘制到其中。类似于以下内容:
- (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);
}
另一方面,当您到达这里时,渲染管道可能为时已晚,因此您可能不得不最终推出自己的动画方案,让您可以完全控制像素定位。
根据 Jeeva 上面的评论,您可以通过将 info.plist 中的以下选项设置为 YES 来使 UIView 边缘呈现抗锯齿。
Renders with edge antialiasing
这是 Jeeva 指向的链接:
http://www.techpaa.com/2012/06/avoiding-view-edge-antialiasing.html