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

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

有人知道这是可能的吗?

我已经使用CALayer进行了调查,并且已经运行了所有实用的程序员Core Animation播客,但是我仍然没有更清楚如何在iPhone上创build这种转换。

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

正如Ben所说的,你需要使用一个CATransform3D来处理UIView的图层旋转。 如此处所述 ,获取透视图的技巧是直接访问CATransform3D(m34)的matrix单元之一。 matrixmath从来就不是我的东西,所以我不能解释为什么这个工作,但它确实。 您需要将此值设置为初始转换的负值,然后将您的图层旋转转换应用于该值。 你也应该能够做到以下几点:

 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; 

从头开始为每次旋转重build图层转换。

一个完整的例子(带代码)可以在这里find,我已经在几个CALayer上实现了基于触摸的旋转和缩放,基于Bill Dudney的一个例子。 该程序的最新版本位于页面的最底部,实现了这种视angular操作。 代码应该是相当简单的阅读。

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

关于CALayer 3D转换和透视的一篇非常好的文章,包括对m34领域的全面解释,可以在这篇优秀的文章中find:

核心animation的3D模型

您只能使用直接应用于UIView的transform属性的核心graphics(Quartz,2D only)转换。 要获得覆盖stream中的效果,您必须使用CATransform3D,这些应用在3D空间中,因此可以为您提供所需的透视图。 您只能将CATransform3D应用到图层,而不是视图,因此您将不得不切换到图层。

查看Xcode附带的“CovertFlow”示例。 这是mac-only(即不适用于iPhone),但很多概念转移很好。

为了补充Brad的答案,并提供一个具体的例子,我在另一篇文章中从我自己的回答中借鉴了类似的话题。 在我的回答中,我创build了一个简单的Swift游乐场,您可以下载并使用 ,在这里演示如何使用简单的层次结构创buildUIView的透视效果,并在使用transformsublayerTransform之间显示不同的结果。 一探究竟。

以下是该post的一些图片:

.sublayerTransform选项

.transform选项