小编典典

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

all

我正在寻找对 UIView 执行透视变换(例如在coverflow中看到的)

有谁知道这是否可能?

我已经使用CALayer并浏览了所有务实的程序员 Core Animation 播客,但我仍然不清楚如何在 iPhone 上创建这种转换。

任何帮助、指针或示例代码片段将不胜感激!


阅读 62

收藏
2022-07-07

共1个答案

小编典典

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

Objective-C

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;

斯威夫特 5.0

if let myView = self.subviews.first {
    let layer = myView.layer
    var rotationAndPerspectiveTransform = CATransform3DIdentity
    rotationAndPerspectiveTransform.m34 = 1.0 / -500
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 45.0 * .pi / 180.0, 0.0, 1.0, 0.0)
    layer.transform = rotationAndPerspectiveTransform
}

它为每次旋转从头开始重建图层变换。

可以在此处找到一个完整的示例(带有代码) ,其中我根据CALayersBill Dudney
的示例在其中实现了基于触摸的旋转和缩放。最新版本的程序,在页面的最底部,实现了这种透视操作。代码应该相当简单易读。

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

2022-07-07