在OpenGL ES中使用UIMotionEffect

Bas*_*ane 1 opengl-es objective-c ios ios7

我专门为我的应用程序使用OpenGL ES(2.0).我正在尝试UIMotionEffect使用我的一个OpenGL对象 - 我需要的只是"倾斜"值.

UIInterpolatingMotionEffect只能应用于a UIView,而hack将应用于UIInterpolatingMotionEffecta UIView并从每帧中获取值,而不是渲染所谓的UIView.但似乎太过于苛刻,不能成为唯一的解决方案.

我试图继承UIMotionEffect,但无法弄清楚是如何- (NSDictionary *)keyPathsAndRelativeValuesForViewerOffset:(UIOffset)viewerOffset工作的(即什么叫它以及如何检索我需要的值).

关于如何使用UIMotionEffectOpenGL的任何想法?

Bas*_*ane 5

我终于测试了@rickster建议的方法:连接UIInterpolatingMotionEffect到我自己定制的GLKView/GL View传递键并检索它们.不幸的是,这个想法在皇室成功.

首先,传递给的键UIInterpolatingMotionEffect必须是UIView可动画的属性,而不能是自定义变量/属性.考虑到大多数人不希望他们的整个背景在单向方向/强度上的视差,这种方法将失败.

其次,您不能只检索值.如果您center.x作为键传递,UIInterpolatingMotionEffect则不会更新,center.x因为更改被视为"动画".因此,您可以检索动画center.x,例如[[view.layer presentationLayer] center];

最后的注释:只需UIView在主线程上创建一个单独的,将其添加到您的UIViewController系统并从中检索值(也在主线程上).到目前为止,我发现这是最简单的解决方案.

此外,由于我需要在单独的线程上检索值,因此我通常会抛出1个值,因为我调度到主线程以检索当前值,同时检索最后一个值集(确保变量)是线程安全的/原子的).

编辑

由于它最好在主线程上访问presentationLayer,但我的方法被调用一个不是main的线程,我调度主线程来检索值并将它放在一个原子属性中.然后我会在线程外返回原子属性.这确保我的辅助线程不会被主线程阻塞,我可以检索我需要的值.

这是我用来从不是主线程的线程中检索值的代码:

@property (atomic) GLKVector2 currentOffset;
@property (atomic, readonly) GLKVector2 offset;

- (GLKVector2)offset
{
    dispatch_async(dispatch_get_main_queue(), ^{
        CGRect frame = [[self.view.layer presentationLayer] frame];
        self.currentOffset = (GLKVector2){-frame.origin.x, -frame.origin.y};
    });

    return self.currentOffset;
}
Run Code Online (Sandbox Code Playgroud)