5

所以我有一个 OpenGL(glView) 视图,它正在渲染一个我打算滚动的菜单。我试图避免重新发明 UIScrollView,所以我在 glView 顶部放置了一个滚动视图。

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

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

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

我制作了一个新的 CADisplayLink 并尝试在没有运气的情况下执行上述操作

我尝试在 scrollViewDidScroll 中调用渲染方法

我试过打电话 [self.view setNeedsDisplay];

我还发现了一个提到调用 timerLoop?

谁能帮帮我

4

2 回答 2

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;
}
于 2012-06-14T14:10:00.227 回答
2

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

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

于 2015-10-17T05:04:49.150 回答