向CAlayer添加带消失点投影的扭曲

时间:2013-02-28 23:33:29

标签: ios calayer perspective catransform3d vanishing-point

我想以一种方式改变一个UIView,为它添加一个透视(有两个消失点)(见下文)。

UIView with applied transform

我想用视图执行此操作的原因是因为我希望转换视图的内容是UITableView的单元格。

我是这种编码的新手,但我认为我必须更改属于子视图的CALayer。但是,我相信,我感兴趣的转换无法使用CATransform3D创建。

有没有人知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

似乎我找到了一种规避/解决问题的方法:

使用CATransform3D转换,可以通过将视图分成两个部分(两个独立的UITableViews)来近似到有利位置。这些应该由UIViewController(不是x代码提供的UITableViewController)来管理,它实现了必要的协议。

然后在viewDidLayoutSubviews:方法中使用以下代码转换两个tableviews。

- (void) viewDidLayoutSubviews {

     CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
    // left View
    // vantage point
    rotationAndPerspectiveTransform.m34 = 1.0 / -150.0;
    // Z-rotation of 90°
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 90.0 * M_PI/180.0, 0, 0,1);
    // X-rotation of 25°
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, -25.0 * M_PI/180.0, 1, 0,0);
    // left view
    [self.view viewWithTag:1].layer.transform = rotationAndPerspectiveTransform;


    //right view
    rotationAndPerspectiveTransform = CATransform3DIdentity;
    rotationAndPerspectiveTransform.m34 = 1.0 / -150;
    // Z-rotation of 90°
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 90.0 * M_PI / 180.0, 0, 0,1);
    // X-rotation of 30°
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 25.0 * M_PI / 180.0, 1, 0,0);
    // right view
    [self.view viewWithTag:2].layer.transform = rotationAndPerspectiveTransform;
}

转换后,可以移动两个tableview,使它们整齐地融合在一起。唯一剩下的工作是连接一台电视机的滚动与另一台电视机的滚动。我还没想出那个。