如何在iPhoneOS中消除别名图层

时间:2010-03-17 20:29:52

标签: iphone core-animation

我们已经将 Reiner Knizia的钱推出了几个月了。它的 做得很好,所以我们一直在更新它,因为时间允许。 然而,有一件事继续让我烦恼。我从来没有能够得到我的 分层卡正确地防止别名。

以下是一个示例:

alt text

直线放置的卡非常干净,但无论何时都是 角度卡片周围的黑线变得锯齿状。我试过这个 取决于艺术作品和绘制的线条隐含的两条线 通过drawRect:,他们都做同样的事情。我试过了 edgeAntiAliasingMask,据我所知,它没有做任何事情。 我已经为子层设置为NO和YES尝试了maskToBounds。

现在我的卡被设置为CALayer,其中有CALayer 正面和背面,加上一些其他的东西,如闪电面具 和一个变暗的面具。以下是代码的一些片段:

   CArdLayer *theCardLayer = [CArdLayer layer];
   theCardLayer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge;

   theCardLayer.front = [CALayer layer];
   theCardLayer.front.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge;
   theCardLayer.front.bounds = theCardLayer.bounds;
   theCardLayer.front.masksToBounds = YES;
   theCardLayer.front.contents = (id)[cardDrawing CGImage];

   [theCardLayer addSublayer:theCardLayer.front];

等...

关于如何使卡片真正消除别名的任何想法?

4 个答案:

答案 0 :(得分:4)

这具有添加透明边框的效果:

layer.cornerRadius = 1.01;

答案 1 :(得分:3)

我能想出的最好结果就是按照我在评论中提出的建议:我将每个(透明)图形逐渐增加1个像素。凭借这一点点的余量,这些卡片在后台合成得更好。

所以,不完全是一个iPhone代码答案,但仍然可以在iPhone上运行。

这是一个“后”镜头,你可以比较上面的“之前”: alt text

答案 2 :(得分:1)

我从未使用过该框架,但看起来抗锯齿只能在卡的内侧工作,而不是在外侧(假设非旋转卡上的圆角是特殊情况)。

所以恕我直言,它实际上是卡片和背景的构图问题

the docs的快速浏览提供了一些提示(只有假设,尝试一下):

确保Opaque属性为false(可能您看到的是优化渲染代码的结果)。

如果将“不透明度”设置为“近乎不透明”(可能为0.9?),请检查它的外观。

检查Mask属性。它应该允许你创建一个像alpha通道一样的面具,带有柔和的边框 - 虽然我知道它不是你想要的......

答案 3 :(得分:1)

如果您不想启动photoshop,可以通过编程方式执行以下操作:

http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

特别是UIImage + Alpha.h / .m中的-transparentBorderImage:category方法。

希望这有助于其他人。

谢谢http://vocaro.com/trevor/blog