我在屏幕上有一个2D网格视图(我称之为瓷砖).每个图块都有一个子视图,我在动画块中围绕Y轴旋转.我已经在每个磁贴上正确设置了sublayerTransform.我正在旋转的所有子视图都展示了3D视角.问题是每个人的消失点是瓷砖的中心而不是屏幕的中心,破坏了3D的错觉.当我在所有切片的父级上设置sublayerTransform时,旋转视图不会显示任何透视图.我相信这是因为sublayerTransform仅适用于图层的子级而不是太孙子级.如何使所有旋转视图使用相同的消失点?我已经包含了一张绘制得很糟糕的图片,以帮助说明这一点.
解决方法
这是解决方案:你必须将翻译变换添加到超级层,然后通过调整子层的位置来弥补它.我成功地使用了以下代码,只需创建一个空的“单视图应用程序”XCode项目并在iPad模拟器上运行:
- (void)viewDidLoad { [super viewDidLoad]; for (int i = 0; i < 6; i++) { CALayer *parent = [CALayer layer]; parent.frame = CGRectMake(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,40,40); layer.position = CGPointMake(-offset + 50,60); layer.backgroundColor = [[UIColor redColor] CGColor]; layer.transform = CATransform3DMakeRotation(M_PI_2,1,0); CATransform3D tr = CATransform3DMakeTranslation(offset,0); CATransform3D t = CATransform3DIdentity ; t.m34 = -4.0f/2000.0f ; parent.sublayerTransform = CATransform3DConcat(t,tr); [parent addSublayer:layer]; } }