首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让CALayers在进行3D变换时使用屏幕中心作为消失点?

如何让CALayers在进行3D变换时使用屏幕中心作为消失点?
EN

Stack Overflow用户
提问于 2012-08-08 08:10:30
回答 4查看 775关注 0票数 4

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

EN

回答 4

Stack Overflow用户

发布于 2012-08-17 15:44:19

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

代码语言:javascript
复制
- (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
EN

Stack Overflow用户

发布于 2012-08-09 01:42:14

这是一个需要解决的相当复杂的问题。我建议你去看看别人是怎么解决这个问题的。看看iCarousel from Nick Lockwood吧。它是一个旋转木马的实现,可能会给你一些启示。

票数 0
EN

Stack Overflow用户

发布于 2012-08-17 14:27:06

您是否尝试过在tiles的父级上设置sublayerTransform,但对tiles使用CATransformLayer?这应该会在您的层次结构中进一步向下传播sublayerTransform。请注意,CATransformLayer只渲染它的子层,而不是它自己的任何内容/背景颜色,因此您在磁贴本身中所做的任何事情都可能需要移动到一个单独的子层中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11855914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档