【问题标题】:iPhone: CALayer + rotate in 3D + antialias?iPhone:CALayer + 3D 旋转 + 抗锯齿?
【发布时间】:2010-04-21 19:38:15
【问题描述】:

一个 iPhone SDK 问题:我正在屏幕上绘制一个 UIImageView。我已经将它以 3D 形式旋转并提供了一些透视效果,因此图像看起来像是以一定角度指向屏幕。这一切都很好。现在的问题是生成的图片的边缘似乎根本没有抗锯齿。有人知道怎么弄吗?

基本上,我正在使用石英 3d 转换来实现我自己的 CoverFlow 版本(是的,是的,设计专利等等)。它工作正常,除了每个封面都没有抗锯齿,而苹果版本是。

我尝试过使用 CALayer 的 edgeAntialisingMask,但这并没有帮助 - 默认情况下每个边缘都应该是抗锯齿的...

谢谢!

【问题讨论】:

  • 您是否将edgeAntialiasingMask 设置为kCALayerLeftEdge | kCALayerRightEdge | kCALayerTopEdge | kCALayerBottomEdge
  • 是的,试过了。此外,该组合是该属性的默认值
  • 似乎透明边缘像素是要走的路(那样magnificationFilterminificationFilter会处理它)

标签: iphone 3d calayer antialiasing


【解决方案1】:

如果您只旋转一张图像,那么一个技巧就可以解决问题。尝试设置

layer.shadowOpacity = 0.01;

经过 3D 旋转后,图片看起来会更平滑

【讨论】:

    【解决方案2】:

    Gloomcore 的答案给出了一个非常简洁的结果。

    但是这有时会让事情变得非常迟钝! 添加光栅化帮助一点点:

    .layer.shadowOpacity = 0.01;
    .layer.shouldRasterize = YES;
    

    我知道问题/答案是旧的,但是我刚刚找到它。

    【讨论】:

    • 是的,添加光栅化只是有点帮助。但不幸的是,它仍然滞后。
    【解决方案3】:

    您可以尝试在图像边缘周围添加一些透明像素,方法是将 UIImageView 放置在您应用旋转的稍大的空视图中,或者更改源图像。

    【讨论】:

    • UIImageView 放在更大的视图中然后应用变换将没有效果——子层不会合成到它们的父级中,而是整个图形由 GPU 合成。不过,在图像边缘添加透明像素应该效果很好。
    【解决方案4】:

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

    幸运的是,我找到了一个解决方案,在正确的时间将 shouldRasterize = NO 设置为恢复我的应用程序的性能。

    我在这里发布了一个解决方案:Antialiasing edges of UIView after transformation using CALayer's transform

    【讨论】:

      【解决方案5】:

      你可以试试这个

      方法:使用layer.shouldRasterize

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

      方法:绘制到UIImage

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 2014-02-18
        • 1970-01-01
        相关资源
        最近更新 更多