我希望在UIView上执行透视变换(如coverflow中所示)

有人知道这是否可能吗?

我已经调查了使用CALayer,并浏览了所有实用程序员的核心动画播客,但我仍然不太清楚如何在iPhone上创建这种转换.

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

推荐答案

正如Ben所说,您需要使用UIView's层,使用CATransform3D来执行layer's rotation.使透视工作(如described here)的诀窍是直接访问CATransform3D(M34)的矩阵cells之一.矩阵数学从来都不是我喜欢的,所以我不能确切地解释为什么这个方法有效,但它确实有效.您需要将初始变换的此值设置为负分数,然后将层旋转变换应用于此.您还应该能够执行以下操作:

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;

Swift 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
}

它会为每次旋转从头开始重建层变换.

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

您在响应中引用的sublayerTransform是应用于UIView's CALayer的子层的转换.如果您没有任何子层,请不要担心.我在示例中使用subayerTransform,原因很简单,因为我要旋转的一个层中包含两个CALayers.

Ios相关问答推荐

ITMS-91064如果NSPrivacyTrackingDomains不为空,NSPrivacyTracking必须为真.键和值

如何使用UICollectionView Compositionallayout在UIKit中正确渲染远程图像

SWIFT图表轴订购问题

如何从Windows PC在iPhone上安装Flutter 应用程序

Swift-如何通过Case Let访问模型变量

Xcode 15阻止我的应用程序运行:由于实时模式录制的高比率,丢失了1条日志(log)/路标消息?

当虚拟对象附加到其网格时,如何刷新创建 ARView 的 SwiftUI UIViewRepresentable?

如何从单独的视图更改修饰符的值

如何解决错误 HE0004:无法在 Visual Studio 2022 中加载框架ContentDeliveryServices

将 URLCache 子类与 URLSession 一起使用

如何在应用程序中显示我的小部件的快照?

从iOS键盘输入时Flutter TextField输入消失

在 Swift 中使用 UITesting 捕获屏幕录像

无法结合 UIImageView 旋转动画和 tableView 部分重新加载

Swift 共享数据模型在页面之间进行通信.这个怎么运作

辅助功能判断器无法在 macOS Monterey 版本 12.3 上的 Xcode 版本 13.3 上运行

判断Apple LiveText是否可用?

如何将 ImageView 放置在 UIView 的中心?

UITableView 背景 colored颜色 在 iPad 上总是白色

所有小部件的Flutter 填充?