IOS:UIScrollView和OpenGL

时间:2012-06-13 14:55:42

标签: iphone ios opengl-es uiscrollview glkit

所以我有一个OpenGL(glView)视图,它呈现一个我想要滚动的菜单。我试图避免重新发明UIScrollView,所以我在glView的顶部放置了一个scrollview。

问题是滚动滚动视图会暂停渲染

此处讨论了类似的问题Animation in OpenGL ES view freezes when UIScrollView is dragged on iPhone

问题是我不知道[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];指

我制作了一个新的CADisplayLink并尝试上面没有运气

我试过在scrollViewDidScroll

中调用render方法

我试过调用[self.view setNeedsDisplay];

我还发现调用timerLoop?

任何人都可以帮助我

2 个答案:

答案 0 :(得分:3)

所以,我找到了一个解决方案:)

创建CADisplayLink * _displayLink;属性(你需要导入QuartzCore)

将您的滚动视图放在最上面。

    #pragma mark - scrollView Delegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //code for moving the object here    
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self startDisplayLinkIfNeeded];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    if (!decelerate) {
        [self stopDisplayLink];
    }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    [self stopDisplayLink];
}

#pragma mark Display Link

- (void)startDisplayLinkIfNeeded
{
    if (!_displayLink) {
        // do not change the method it calls as its part of the GLKView
        _displayLink = [CADisplayLink displayLinkWithTarget:self.view selector:@selector(display)];
        [_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode];
    }
}

- (void)stopDisplayLink
{
    [_displayLink invalidate];
    _displayLink = nil;
}

答案 1 :(得分:1)

请参阅session 223 of Apple WWDC 2012。从21:21开始,他们讨论了将UIScrollView与OpenGL视图集成。有趣的部分从25:53开始。

主要的源代码是由Burf2000编写的,但是这个视频解释了为什么它正在工作,UIScrollView如何真正起作用以及它如何与OpenGL交互。它还帮助我调试了我的代码。