我在屏幕上有一个2D网格视图(我称之为图块)。每个图块都有一个子视图,我在动画块中围绕Y轴旋转。我已经在每个磁贴上正确设置了sublayerTransform。我正在旋转的所有子视图都展示了3D视角。问题是每个人的消失点是瓷砖的中心而不是屏幕的中心,破坏了3D的错觉。当我在所有切片的父级上设置sublayerTransform时,旋转视图不会显示任何透视图。我相信这是因为sublayerTransform仅适用于图层的子级而不是太孙子级。如何使所有旋转视图使用相同的消失点?我已经包含了一张绘制得很糟糕的图片,以帮助说明这一点。
答案 0 :(得分:1)
这是解决方案:你必须将翻译变换添加到超级层,然后通过调整子层的位置来弥补它。我成功地使用了以下代码,只需创建一个空的“单视图应用程序”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];
}
}
答案 1 :(得分:0)
这是一个相当复杂的问题需要解决。我建议你看看别人如何解决它。看看iCarousel from Nick Lockwood。这是一个轮播实现,可能会给你一些见解。
答案 2 :(得分:0)
您是否尝试在图块的父级上设置sublayerTransform
,但是使用CATransformLayer
作为图块?这应该在您的层次结构中进一步传播sublayerTransform
。请注意,CATransformLayer
仅渲染其子图层,而不是其自身的任何内容/背景颜色,因此您在图块本身中执行的任何操作都可能需要移动到单独的子图层中。
答案 3 :(得分:0)
尝试旋转切片而不是他们的子视图。在瓷砖视图的超级视图中,设置透视变换:
CATransform3D t = kCATransform3DIdentity ;
t.m34 = -1.0f/2000.0f ;
parentLayer.sublayerTransform = t ;
那会有用吗?虽然我假设你明确地不想自己旋转瓷砖?