4

我在屏幕上有一个 2D 视图网格(我将它们称为图块)。每个图块都有一个子视图,我在动画块中围绕 Y 轴旋转。我已经在每个图块上正确设置了 sublayerTransform。我正在旋转的所有子视图都显示 3D 透视图。问题是每一个的消失点是图块的中心而不是屏幕的中心,从而破坏了 3D 的错觉。当我在所有瓦片的父级上设置 sublayerTransform 时,旋转视图不会显示任何透视图。我相信这是因为 sublayerTransform 仅适用于层的孩子而不是孙辈。如何让所有旋转视图使用相同的消失点?我已经包含了一个画得不好的图像来帮助说明这一点。在此处输入图像描述

4

4 回答 4

1

这是解决方案:您必须将平移变换添加到超级层,然后通过调整子层的位置来弥补它。我已经成功使用了以下一段代码,只需创建一个空的“Single View Application”XCode 项目并在 iPad 模拟器上运行:

- (void)viewDidLoad
{
    [super viewDidLoad];

    for (int i = 0; i < 6; i++)
    {
        CALayer *parent = [CALayer layer];
        parent.frame = CGRectMake(0, 0, 100, 100);
        parent.position = CGPointMake(70 + 120*i, 70);
        parent.backgroundColor = [[UIColor greenColor] CGColor];
        [self.view.layer addSublayer:parent];

        float width = self.view.frame.size.width/2.0;
        float offset = (width - parent.position.x);

        CALayer *layer = [CALayer layer];
        layer.frame = CGRectMake(0, 0, 40, 40);
        layer.position = CGPointMake(-offset + 50, 60);
        layer.backgroundColor = [[UIColor redColor] CGColor];
        layer.transform = CATransform3DMakeRotation(M_PI_2, 0, 1, 0);

        CATransform3D tr = CATransform3DMakeTranslation(offset, 0, 0);
        CATransform3D t = CATransform3DIdentity ;
        t.m34 = -4.0f/2000.0f ;
        parent.sublayerTransform = CATransform3DConcat(t, tr);

        [parent addSublayer:layer];    
    }
}
于 2012-08-17T07:44:19.140 回答
0

尝试旋转瓷砖本身而不是它们的子视图。在您的平铺视图的超级视图中,设置您的透视变换:

CATransform3D t = kCATransform3DIdentity ;
t.m34 = -1.0f/2000.0f ;
parentLayer.sublayerTransform = t ;

那行得通吗?尽管我假设您明确不想自己旋转瓷砖?

于 2012-08-17T06:34:55.047 回答
0

这是一个相当复杂的问题要解决。我建议你看看其他人是如何解决的。看看Nick Lockwood 的 iCarousel。这是一个轮播实现,可能会给您一些见解。

于 2012-08-08T17:42:13.650 回答
0

您是否尝试过设置sublayerTransform瓷砖的父级,但使用 CATransformLayer瓷砖?这应该在您的层次结构中传播得sublayerTransform更远。请注意,CATransformLayer仅渲染其子图层,而不是其自身的任何内容/背景颜色,因此您在图块本身中所做的任何事情都可能需要移动到单独的子图层中。

于 2012-08-17T06:27:06.250 回答