首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将UIMotionEffect与OpenGL ES结合使用

将UIMotionEffect与OpenGL ES结合使用
EN

Stack Overflow用户
提问于 2014-02-12 22:01:20
回答 2查看 631关注 0票数 1

我只在我的应用程序中使用OpenGL ES (2.0)。我正试图让UIMotionEffect使用我的OpenGL对象之一--在那里,我所需要的就是“倾斜”值。

UIInterpolatingMotionEffect只能应用于UIView,而黑客则是将UIInterpolatingMotionEffect应用于UIView并在每个帧中获取值,而不是呈现假定的UIView。但这似乎太过刺耳,而不是唯一的解决办法。

我试图将UIMotionEffect子类化,但不知道- (NSDictionary *)keyPathsAndRelativeValuesForViewerOffset:(UIOffset)viewerOffset是如何工作的。调用它以及如何检索我需要的值)。

对于如何将UIMotionEffect与OpenGL结合使用有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-26 05:28:30

最后,我测试了@rickster建议的方法:将UIInterpolatingMotionEffect连接到我的GLKView/GLKView键,这些键是定制的,只需检索它们。不幸的是,这一想法完全失败了。

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

第二,不能只是检索值。如果您将center.x作为键传递,UIInterpolatingMotionEffect将不会更新center.x,因为更改被视为“动画”。因此,您必须检索动画center.x,例如[[view.layer presentationLayer] center];

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

另外,由于我需要在一个单独的线程上检索值,所以我通常落后一个值,因为我向主线程分派来检索当前值,同时检索最后一个值集(确保变量是线程安全/原子的)。

编辑

因为访问主线程上的presentationLayer是最好的,但是我的方法被调用的线程不是main,所以我分派主线程检索值并将其放入原子属性中。然后,我将返回线程外部的原子属性。这确保我的次要线程不会被主线程阻塞,并且我可以检索我需要的值。

下面是用于从不是主线程的线程中检索值的代码:

代码语言:javascript
复制
@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;
}
票数 5
EN

Stack Overflow用户

发布于 2014-02-13 19:11:19

UIInterpolatingMotionEffect通过使用键值编码为UIView上的任何数字属性设置值来工作。这可以是您定义的任何属性,而不仅仅是内置于UIView类中的属性。

您需要某种UIView才能将内容显示在屏幕上。如果您在iOS上使用iOS ES,您(最好)使用GLKView,它是一个UIView子类,它管理自己的GL框架缓冲区,并为您提供一个地方来编写GL绘图代码以呈现到这些框架缓冲区中。(如果不使用GLKView,则可能使用某种自定义UIView子类,它使用CAEAGLLayer来呈现其内容。)

无论哪种方式,如果您已经在屏幕上获得GL呈现的内容,那么您已经有了一个UIView。如果该视图不是您自己的自定义子类(无论是直接的UIView子类还是GLKView子类),则可以将其变为自定义子类,并在其上定义您自己的自定义属性。然后设置您的UIInterpolatingMotionEffect以使用这些属性。在您的视图中,子类或其他对象负责您的GL呈现,读取这些属性的值,并使用它们来设置场景。(例如,您可以使用它们来设置ModelView矩阵,并将其传递给着色制服。)

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

https://stackoverflow.com/questions/21740713

复制
相关文章

相似问题

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