iOS: UIScrollView 和 OpenGL

5
所以我有一个OpenGL(glView)视图,正在渲染一个菜单,我想要滚动它。我试图避免重新发明UIScrollView,因此我在glView上方放置了一个scrollView。
问题是滚动scrollView会暂停渲染。
这里讨论了类似的问题 Animation in OpenGL ES view freezes when UIScrollView is dragged on iPhone 问题是我不知道[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];是什么意思。
我已经制作了一个新的CADisplayLink并尝试进行上述操作,但没有成功。
我尝试在scrollViewDidScroll中调用渲染方法。
我尝试调用[self.view setNeedsDisplay];。
我还发现了一个涉及调用timerLoop的内容?
请问有人能帮助我吗?

我不知道,但我对答案非常感兴趣,因为我正在做类似的事情。我想知道是否将UIScollViews的drawRect(通过setNeedsDisplay间接地)从主线程中移出可能会解决问题。到目前为止,我一直在主线程中严格执行所有UI操作。 - Patrick Borkowicz
2个回答

3

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

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

将你的scrollView置于最上层。

    #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;
}

2
请参考苹果2012年WWDC的第223场会议。从21:21开始,他们讲解了如何将UIScrollView与OpenGL视图集成。有趣的部分从25:53开始。主要的源代码是由Burf2000编写的,但这个视频解释了为什么它能够工作,UIScrollView的实际工作原理以及它如何与OpenGL交互。它还帮助我调试我的代码。

源代码是由Burf2000编写的。该源代码是苹果提供的示例代码。搜索OpenGLScroller以获取完整工作示例。 - chunkyguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接