我正在寻找对UIView执行透视转换(如Coverflow中所示)
有人知道这是否可能吗?
我调查了使用 CALayer
所有实用的程序员Core Animation播客的并进行了遍历,但是我仍然不清楚如何在iPhone上创建这种转换。
任何帮助,指针或示例代码片段都将不胜感激!
我正在寻找对UIView执行透视转换(如Coverflow中所示)
有人知道这是否可能吗?
我调查了使用 CALayer
所有实用的程序员Core Animation播客的并进行了遍历,但是我仍然不清楚如何在iPhone上创建这种转换。
任何帮助,指针或示例代码片段都将不胜感激!
Answers:
正如Ben所说,您需要使用UIView's
层CATransform3D
来执行,以处理图层layer's
rotation
。如此处所述,获取透视工作的技巧是直接访问(m34)的矩阵cells
之一CATransform3D
。矩阵数学从来都不是我的事,因此我无法确切解释为什么这样做,但确实如此。您需要为初始转换将此值设置为负分数,然后将图层旋转转换应用于该值。您还应该能够执行以下操作:
物镜
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
}
每次旋转都会从头开始重建图层变换。
在此处可以找到完整的示例(包含代码),其中我CALayers
基于Bill Dudney的示例在几个示例上实现了基于触摸的旋转和缩放。该程序的最新版本位于页面的最底部,实现了这种透视操作。该代码应相当简单易读。
在sublayerTransform
你指的是你的反应是一个转换,应用到你的子层UIView's
CALayer
。如果您没有任何子层,请不必担心。我在示例中使用sublayerTransform只是因为CALayers
我旋转的一层中包含两个。
您只能使用直接应用于UIView的transform属性的Core Graphics(仅限于石英,2D)变换。要获得Coverflow的效果,您必须使用在3D空间中应用的CATransform3D,因此可以为您提供所需的透视图。您只能将CATransform3D应用于图层,而不能应用于视图,因此您将不得不切换到图层。
查看Xcode随附的“ CovertFlow”示例。它仅用于Mac(即,不适用于iPhone),但是许多概念都可以很好地传递。
为了增加布拉德的答案并提供一个具体的例子,我在另一篇类似主题的文章中借用了自己的答案。在我的回答中,我创建了一个简单的Swift游乐场,您可以下载和使用它,并在其中演示如何创建具有简单图层层次结构的UIView的透视效果,并展示使用transform
和之间的不同结果sublayerTransform
。看看这个。
以下是帖子中的一些图片:
您可以使用iCarousel SDK获得准确的Carousel效果。
您可以使用出色的免费iCarousel库在iOS上即时获得Cover Flow效果。您可以从https://github.com/nicklockwood/iCarousel下载它,并通过添加桥接标头(用Objective-C编写)相当容易地将其放入Xcode项目。
如果您之前没有向Swift项目添加Objective-C代码,请按照以下步骤操作:
Swift 3示例代码:
override func viewDidLoad() {
super.viewDidLoad()
let carousel = iCarousel(frame: CGRect(x: 0, y: 0, width: 300, height: 200))
carousel.dataSource = self
carousel.type = .coverFlow
view.addSubview(carousel)
}
func numberOfItems(in carousel: iCarousel) -> Int {
return 10
}
func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView {
let imageView: UIImageView
if view != nil {
imageView = view as! UIImageView
} else {
imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 128, height: 128))
}
imageView.image = UIImage(named: "example")
return imageView
}