Я думаю, что вам лучше всего воспользоваться схемой, которую вы предлагаете в конце - сохранить статическое представление 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 при прокрутке вида прокрутки.