В нашем приложении UIScrollView над CAEAGLLayer. UIScrollView содержит некоторые UIViews (красные прямоугольники). В CAEAGLLayer мы рисуем белые прямоугольники. Центры белых прямоугольников такие же, как центры красных прямоугольников. Когда прокручивается UIScrollView, мы обновляем позиции белых прямоугольников в CAEAGLLayer и визуализируем их.
Мы получаем ожидаемый результат: центры белых прямоугольников всегда совпадают с центрами красных прямоугольников.
Но мы не можем синхронизировать обновления CAEAGLLayer с перемещением представлений внутри UIScrollView. У нас есть какая-то ошибка: красные прямоугольники отстают от белых прямоугольников.
Говоря грубо, мы действительно хотим сделать задержку CAEAGLLayer вместе с UIScollView.
Мы подготовили образец кода. Запустите его на устройстве и прокрутите, и вы увидите, что белые прямоугольники (нарисованные OpenGL) движутся быстрее, чем красные (обычные UIViews). OpenGL обновляется в scrollViewDidScroll: делегировать вызов.
https://www.dropbox.com/s/kzybsyu10825ikw/ios-opengl-scrollview-test.zip
Он ведет себя одинаково даже в iOS Simulator, просто взгляните на видео: http://www.youtube.com/watch?v=1T9hsAVrEXw
Красный = UIKit, белый = OpenGL
Код:
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
// reuses red squares that are gone outside thw bounds
[overlayView updateVisibleRect:CGRectMake(...)];
// draws white squares using OpenGL under the red squares
[openGlView updateVisibleRect:CGRectMake(...)];
}
Изменить:
Та же проблема может быть легко продемонстрирована в упрощенном примере. Рабочий xcodeproj можно найти по адресу:
https://www.dropbox.com/s/vznzccibhlf8bon/simple_sample.zip
Пример проекта в основном рисует и анимирует набор квадратов WHITE в OpenGL и делает то же самое для RED-набора UIViews. Отставание можно легко увидеть между красным и белым квадратами.