当前位置:  开发笔记 > IOS > 正文

如何将透视变换应用于UIView?

如何解决《如何将透视变换应用于UIView?》经验,为你挑选了2个好方法。

我想在UIView上执行透视变换(例如在coverflow中看到)

有谁知道这是否可能?

我已经调查过使用CALayer并且已经完成了所有实用的程序员Core Animation播客,但我仍然不清楚如何在iPhone上创建这种转换.

任何帮助,指针或示例代码片段将非常感谢!



1> Brad Larson..:

正如Ben所说,你需要使用UIView的图层,使用CATransform3D来执行图层的旋转.如此处所述,获得透视工作的技巧是直接访问CATransform3D(m34)的一个矩阵单元.矩阵数学从来就不是我的事情,所以我无法解释为什么这样有效,但确实如此.您需要将此值设置为初始变换的负分数,然后将图层旋转变换应用于该变换.您还应该能够执行以下操作:

UIView *myView = [[self subviews] objectAtIndex:0];
CALayer *layer = myView.layer;
CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
rotationAndPerspectiveTransform.m34 = 1.0 / -500;
rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
layer.transform = rotationAndPerspectiveTransform;

每次旋转都会从头开始重建图层变换.

在这里可以找到这个(带代码)的完整示例,其中我基于Bill Dudney的一个例子,在几个CALayers上实现了基于触摸的旋转和缩放.该程序的最新版本位于页面的最底部,实现了这种透视操作.代码应该相当简单易读.

您在响应中引用的sublayerTransform是一个应用于UIView的子层的变换UIView's.如果您没有任何子图层,请不要担心.我在我的例子中使用sublayerTransform只是因为我正在旋转的一个图层中包含两个CALayer.


仅供参考,m34单元影响透视变换的原因是矩阵中的单元格影响世界空间Z值如何映射到剪辑空间W值(用于透视投影).阅读同源转换矩阵以获取更多信息.
@ iPadDeveloper2011 - 当你在同一平面上有另一个不透明的视图或图层时,你正试图旋转视图或图层.远离屏幕投影的视图或图层的一半将位于此另一视图下方,因此将被隐藏.您可以重新排序视图层次结构以防止这种情况发生,也可以使用zPosition属性将前景视图移动到高于切割它的位置上方.

2> Ben Gottlieb..:

您只能使用直接应用于UIView的transform属性的Core Graphics(仅Quartz,2D)变换.要在coverflow中获得效果,您必须使用CATransform3D,它们应用于三维空间,因此可以为您提供所需的透视图.您只能将CATransform3D应用于图层而不是视图,因此您必须为此切换到图层.

查看Xcode附带的"CovertFlow"示例.它只是mac-only(即不适用于iPhone),但很多概念转移得很好.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有