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的主要内容,如果未能解决你的问题,请参考以下文章
Mapbox iOS群集可以工作,但是圆形样式图层和数字图层不会出现/反映群集的标记密度
IOS – OpenGL ES 调节图像色彩替换 GPUImageFalseColorFilter