使用iPhone上的coremotion/devicemotion模拟图像浮动效果
-
26-10-2019 - |
题
我在一个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的前面添加负标志即可。
不隶属于 StackOverflow