我在一个ViewContoller中有一系列图像。

我通过改变他们的各个层来“漂浮”它们:

img.layer.transform = CATransform3DMakeTranslation(0.0f, 0.0f, myZ);

这给出了使图层漂浮在屏幕上方的效果 - 在模拟器中,将没有明显的效果(正确)。

我要做的是要产生效果,使设备向左/右/向前/或向后移动设备会使其看起来像浮动的层一样巧妙。当您将设备向左倾斜时,它应将整个视图倾斜到右侧。这将使您感觉就像移动设备使您可以在拐角处看到 - 即,它会感觉到这些图像确实在屏幕上方漂浮,因为它们会以不同的速度移动(基于Z索引)。

我做了一个测试项目(项目文件在这里)有一个示例项目来演示这一点。

我的问题是我不是数学人,所以我正在为模拟微妙的浮动效果而苦苦挣扎。现在,我有一个devicemotion的听众,然后确实如此:

self.view.layer.sublayerTransform = CATransform3DMakeRotation(20.0f * M_PI / 180.0f, 2*motion.attitude.pitch, -2*motion.attitude.roll, 0);

这与我想要的非常接近,但这不是完全正确的。

我认为这种效果将是可以在许多不同应用程序中使用的。我希望将其扩展到一个朋友,我正在处理面部检测(因此,即使他们完全保持电话/设备的静止状态,它也会根据人的脸部移动来移动父的视图)。

我意识到我会让人们回答“只使用opengl”。这不是我需要的答案 - 除非您发布了一块代码,以显示如何将其集成到该项目中。 (我不是在寻找要解决的新问题。:-)

同样,整个项目都在这里(iPhone浮动视图)对于任何想看到现在效果的人。 (在此工作时,我将离开这里链接的完整(工作)项目以供后代。)

有帮助吗?

解决方案

我想我有这个!用这个:

    [appDelegate.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue]
                                                   withHandler:
     ^(CMDeviceMotion *motion, NSError *error) {

         CATransform3D transform;
         transform = CATransform3DMakeRotation(motion.attitude.pitch, 1, 0, 0);
         transform = CATransform3DRotate(transform, motion.attitude.roll, 0, 1, 0);

         self.view.layer.sublayerTransform = transform;
     }];

对于我来说,像魅力一样的工作,如果您想翻转轴,只需在那1s的前面添加负标志即可。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top