ios – 在进行3D转换时,如何让CALayers使用屏幕中心作为消失点?

前端之家收集整理的这篇文章主要介绍了ios – 在进行3D转换时,如何让CALayers使用屏幕中心作为消失点?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在屏幕上有一个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];    
    }
}

猜你在找的iOS相关文章