iPhone:CALayer + 3D旋转 + 抗锯齿?

7
一个iPhone SDK问题:我在屏幕上绘制了一个UIImageView。我已经将它在3D空间中旋转并提供了一些透视效果,所以图片看起来像是以一定角度指向屏幕内部。这都很好用。现在的问题是结果图片的边缘似乎没有进行抗锯齿处理。有人知道如何解决吗?
本质上,我正在使用Quartz 3D变换实现自己版本的CoverFlow(是的,设计专利等等),但每个封面都没有进行抗锯齿处理,而苹果的版本却有。
我尝试过改变CALayer的edgeAntialisingMask,但这并没有帮助-默认情况下应该对每个边缘进行抗锯齿处理...谢谢!

你是否将 edgeAntialiasingMask 设置为 kCALayerLeftEdge | kCALayerRightEdge | kCALayerTopEdge | kCALayerBottomEdge - rpetrich
是的,试过了。另外,那个组合是该属性的默认设置。 - Colin
那么似乎透明的边缘像素是一个好选择(这样magnificationFilterminificationFilter会自动处理)。 - rpetrich
5个回答

19
如果您只旋转一张图片,那么有一个技巧可以解决这个问题。尝试设置 layer.shadowOpacity = 0.01;
之后,图片在3D旋转后会显得更加平滑。

7
"Gloomcore的答案给出了非常好的结果。但是有时会使事情变得很卡顿!添加光栅化可以稍微改善一下:"
.layer.shadowOpacity = 0.01;
.layer.shouldRasterize = YES;

我知道这个问题/答案很久了,但是嘿,我刚刚发现它。


是的,添加光栅化确实有所帮助。但不幸的是,它仍然很卡顿。 - Matt Mc

2

您可以尝试在图像边缘添加一些透明像素,方法是将UIImageView放入稍大的空视图中,并对其进行旋转,或更改源图像。


1
UIImageView 放置在较大的视图中,然后应用变换将不会产生任何效果--子层不会合成到其父层中,而是整个图形由 GPU 合成。但是,在图像边缘添加透明像素应该可以很好地解决问题。 - rpetrich

0

我曾经遇到过类似的问题,只设置shouldRasterize = YES就解决了,但是因为我正在重复使用我的视图(和层),所以shouldRasterize = YES会影响性能。

幸运的是,我找到了一个解决方案,在适当的时候将shouldRasterize = NO,以恢复应用程序的性能。

我在这里发布了一个解决方案:使用CALayer的变换后抗锯齿UIView的边缘


0

你可以尝试这个方法

方法:使用layer.shouldRasterize

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

方法: 绘制到 UIImage

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接