iOS OpenGL слой и UIScrollView - PullRequest
       9

iOS OpenGL слой и UIScrollView

4 голосов
/ 20 февраля 2012

Я создаю приложение для рисования на iPad, где пользователь может рисовать и прокручивать рисунок. (Представьте себе холст шириной 4000 пикселей с шириной порта просмотра 1024). В настоящее время я использую OpenGL для рисования, а с шириной 1024 он прекрасно работает. Когда я изменяю размер кадра UIView на 4000, я получаю «не удалось создать полный объект кадра буфера 8cd6». Когда я уменьшил ширину до 2000, я получил «дурацкие» результаты. Я знаю, что могу корректно управлять кадром, поскольку ширина кадра 500 дает правильный результат.

Я также думал о том, чтобы оставить ширину 1024 и переместить камеру слоя OpenGL, но как это будет работать с настроенным UIScrollView? Поэтому я не уверен, что делать в данный момент. Любой совет?

Заранее спасибо

P.S. Код в значительной степени основан на примере GLPaint, который Apple предоставляет здесь

Ответы [ 2 ]

5 голосов
/ 20 февраля 2012

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

Я бы настоятельно рекомендовал выполнять масштабирование в панорамировании с помощью камеры OpenGL, а не пытаться использовать его в UIScrollView. Это будет немного больше работы для настройки, но в конечном итоге путь ИМХО.

...