我在屏幕上有一个2D的视图网格(我称之为tiles)。每个平铺都有一个子视图,我在动画块中绕着Y轴旋转它。我已经在每个磁贴上正确地设置了sublayerTransform。我旋转的所有子视图都展示了3D透视图。问题是,每个消失点都是瓷砖的中心,而不是屏幕的中心,破坏了3D的错觉。当我在所有平铺的父级上设置sublayerTransform时,旋转视图不会显示任何透视图。我相信这是因为sublayerTransform只适用于某一层的子层,而不是太孙子层。如何使所有旋转视图使用相同的消失点?我提供了一张画得很差的图片来帮助说明这一点。

发布于 2012-08-17 15:44:19
这是解决方案:你必须在上层添加平移变换,然后通过调整子层的位置来弥补它。我已经成功地使用了以下代码,只需创建一个空的"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-09 01:42:14
这是一个需要解决的相当复杂的问题。我建议你去看看别人是怎么解决这个问题的。看看iCarousel from Nick Lockwood吧。它是一个旋转木马的实现,可能会给你一些启示。
发布于 2012-08-17 14:27:06
您是否尝试过在tiles的父级上设置sublayerTransform,但对tiles使用CATransformLayer?这应该会在您的层次结构中进一步向下传播sublayerTransform。请注意,CATransformLayer只渲染它的子层,而不是它自己的任何内容/背景颜色,因此您在磁贴本身中所做的任何事情都可能需要移动到一个单独的子层中。
https://stackoverflow.com/questions/11855914
复制相似问题