CATransform3d / CGAffineTransform为现有的动画变换添加透视效果?

时间:2015-04-03 15:23:38

标签: ios animation matrix cgaffinetransform catransform3d

我通过CGAffineTransform创建了动画。我使用了animateWithDuration:并在其中设置了变换。但是我忘记了所有的观点还应该从一个定义的角度进行翻译。我想实现类似的透视变换:

http://cdn.iphonehacks.com/wp-content/uploads/2014/08/ios-8-safari-tab-view.jpg

我想:

  • 是3D空间;

  • 所有rects同样有一条边属于一个不可见的表面;

  • 所有rects都有相同的角度(因此所有的rects都是平行的);

  • 人类的外表专注于中心,因此人类似乎所有的角落都有不同的角度(但仅因透视效果而发生)。

据我所知,CGAffineTransformCATransform3D之间可以互换,因此对我来说没有区别。

问题:

1)我知道如何表示旋转,缩放,平移等。但是如何围绕锚点实现透视?我应该采取哪些行动和顺序?

2)即使我找到了正确的动作序列,那么如何将它们应用到现有的动画CGAffineTransform?据我所知,变换的一半应该是静态的,另一个应该是动画的。如何合并?

1 个答案:

答案 0 :(得分:0)

问题1

我编写了代码,但没有透视。

我拒绝透视的原因是它太慢了。

在iPad中,您无法通过删除不可见的页面来优化应用程序,因为它们都可能是可见的(或者从边缘太近以释放它们)。所以你只能缩小它们的尺寸。这很奇怪,但如果你想实现iphone版本,那么你就无法优化尺寸,但可以优化不可见的页面。

在iPad中,您需要进行太多计算,因此也需要重新调用。此外,您可以在后台存储UIWebView个对象,这会消耗大量内存(我检查过UIWebView个网站onliner.by的许多实例 - 它只是“硬”且复杂的网站) 。甚至在苹果产生记忆警告之前,一切都变得缓慢。

问题2

警告! CGAffineTransformCATransform3D有时只能在自己之间转换。至少不是每个CATransform3D都可以转换为CGAffineTransform,例如,如果它包含透视,就像我的情况一样。

在我的情况下,我需要CATransform3DCGRect,因为即使您应用第一个,然后您只是缩放整个视图,但如果您应用第二个,则减少视图的边界但其子视图不按比例缩放,并且某些属性(例如字体大小)根本不会缩放,您需要手动缩放它们。最后我使用了以下组合: 1)边界全屏,屏幕中心为中心; 2)与1相同,但应用变换比例并移动到适当的位置; 3)与2相同,但我从transform属性中删除了缩放,并通过较小的边界再次添加它,并减少了必要的大小,字体等。这种状态只是为了减少内存消耗。