iOS OpenGL 层和 UIScrollView

Posted

技术标签:

【中文标题】iOS OpenGL 层和 UIScrollView【英文标题】:iOS OpenGL layer and UIScrollView 【发布时间】:2012-02-20 01:22:21 【问题描述】:

我正在 iPad 上创建一个绘图应用程序,用户可以在其中绘制和滚动绘图。 (想象一个 4000 像素宽、视口宽度为 1024 的画布)目前,我使用 OpenGL 进行绘图,宽度为 1024,效果很好。当我将 UIView 的帧大小更改为 4000 时,我得到“无法使完整的帧缓冲区对象 8cd6”。当我将它减小到 2000 的宽度时,我最终得到了“古怪”的结果。我知道我可以正确操作框架,因为框架宽度为 500 会产生正确的结果。

我还考虑离开宽度 1024 并移动 OpenGL 层的相机,但是这将如何与我设置的 UIScrollView 一起工作?所以我不确定目前该做什么。有什么建议吗?

提前致谢

附:代码主要基于苹果提供的 GLPaint 示例here

【问题讨论】:

嗨,我正在解决同样的问题,但我无法让我的实现工作。您设法解决了您的问题吗? 这是一个很好的会议,有帮助:asciiwwdc.com/2012/sessions/223 【参考方案1】:

我认为你最好使用你在最后建议的方案 - 保持 OpenGL 视图静态并在滚动视图之外,并移动其内容以匹配滚动视图的移动。

假设您使用的是GLKView,请实现您的glkView:drawInRect:,以便它从您的滚动视图中获取contentOffset(可能还有bounds)属性并进行适当的绘制。例如。 (假设您使用 GLES 1.0 只是因为矩阵操作方法众所周知):

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // displayArea will be the area the scroll view is
    // currently displaying; taking just the bounds would
    // likely be fine too
    CGRect displayArea;
    displayArea.origin = scrollView.contentOffset;
    displayArea.size = scrollView.bounds.size;

    // assuming (0, 0) in the GL view is in the centre,
    // we'll adjust things so that it's in the corner ala
    // UIKit
    CGPoint centre = CGPointMake(
           displayArea.origin.x + displayArea.size.width*0.5f,
           displayArea.origin.y + displayArea.size.height*0.5f);

    glPushMatrix();

        // apply the scroll as per the scroll view
        // so that its centre is aligned with our centre
        glTranslatef(-centre.x, -centre.y, -1);

                /* rest of drawing here */

    glPopMatrix();

然后将自己作为代理连接到滚动视图并执行:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

    [glView setNeedsDisplay];

确保滚动视图滚动时 GL 重绘。

【讨论】:

【参考方案2】:

我强烈建议您使用 OpenGL 相机进行缩放平移,而不是尝试在 UIScrollView 中使用它。设置起来会做更多的工作,但最终还是要走恕我直言。

【讨论】:

以上是关于iOS OpenGL 层和 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

屏蔽层和添加子层iOS之间的区别

带有 uiscrollview 分页的 iOS 渐变动画

Mapbox iOS群集可以工作,但是圆形样式图层和数字图层不会出现/反映群集的标记密度

IOS – OpenGL ES 调节图像色彩替换 GPUImageFalseColorFilter

IOS – OpenGL ES 图像漩涡 GPUImageSwirlFilter

IOS OpenGL ES GPUImage GPUImageWeakPixelInclusionFilter