Перенос пользовательских представлений в OpenGL ES - PullRequest
9 голосов
/ 21 ноября 2008

Я пытаюсь создать пользовательский переход, который будет служить заменой для перехода по умолчанию, который вы получите здесь, например:

[self.navigationController pushViewController:someController animated:YES];

Я подготовил представление на основе OpenGL, которое воздействует на некоторую статическую текстуру, сопоставленную с плоскостью (скажем, это копия эффекта отражения в Core Animation). Что я не знаю, как это сделать:

  • захватывает текущий вид содержимого и создает из него текстуру (я помню, что видел функцию, которая делает это, но не может ее найти)
  • как сделать то же самое для представления, которое в данный момент находится вне экрана и заменит текущее представление
  • Существуют ли какие-либо API, к которым я могу подключиться, чтобы сделать свой класс перехода максимально естественным (сделать его своего рода эффектом базовой анимации)?

Любые мысли или ссылки приветствуются!

UPDATE

Ответ Джеффри Форбса прекрасно работает как решение для захвата содержимого представления.

Что я еще не понял, так это как захватить содержимое представления, к которому я хочу перейти, которое должно быть невидимым до завершения перехода.

Кроме того, какой метод я должен использовать, чтобы представить представление OpenGL? Для демонстрации я использовал pushViewController. Это влияет на панель навигации, хотя, на самом деле, я хочу вернуться на один пункт назад с анимацией, проверьте это видео для объяснения:

http://vimeo.com/4649397.

Другой вариант - использовать presentViewController, но он показывает полноэкранный режим. Как вы думаете, может быть полезным создание другого окна (или вида?)?

Ответы [ 4 ]

3 голосов
/ 01 марта 2010

Я только что собрал класс перехода для реализации собственной анимации перехода в OpenGL ES.

Не стесняйтесь читать об этом здесь

В проекте есть два примера переходов, не стесняйтесь добавлять свои собственные в него.

3 голосов
/ 23 ноября 2008

Хотя я не могу полностью ответить на ваш вопрос, не проведя собственных исследований, я могу немного помочь:

- Чтобы получить представление о контроллере UINavigationController, вам нужно сделать снимок экрана. Самый простой способ сделать это - перехватить его в UIImage:

UIGraphicsBeginImageContext(self.view.frame.size);
[[self.view layer] renderInContext:UIGraphicsGetCurrentContext()];
UIImage* test = UIGraphicsGetImageFromCurrentImageContext();
UIImageView* view = [[UIImageView alloc] initWithImage:test];
UIGraphicsEndImageContext();

Я не уверен, что вы можете отобразить GLContext (не знакомый по телефону) в CGImage, но я бы сделал что-то подобное (и инициировал бы UIImage из этого). Я бы делал рендеринг каждого кадра анимации, которую вы пытаетесь сделать, и добавлял его в UIImageView, используя анимацию, предоставляемую внутри. Это если ваша анимация достаточно проста. В противном случае это может привести к написанию вашей собственной анимационной функции: - /

1 голос
/ 18 апреля 2009

Я думаю, что функция, о которой вы, возможно, думаете: http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexImage2D.xml ... вы устанавливаете область просмотра на размер текстуры и затем рисуете как обычно, затем выполняете glCopyTexImage2D, чтобы скопировать сцену в текстуру.

или вы должны посмотреть на объекты FrameBuffer. Шаблон OpenGL по умолчанию в XCode использует их. Просто сгенерируйте пример проекта, чтобы увидеть, как они работают.

0 голосов
/ 11 января 2015

Недавно я написал несколько переходных анимаций между такими контроллерами представления, как вы. Если вы хотите получить дополнительную информацию из невидимого представления, вы можете попытаться отложить переход следующим образом:

- (void)animationFromModalView:(UIView *)modalView toMasterView:(UIView *)masterView
{

[masterView setNeedsLayout];
[masterView layoutIfNeeded];

[self performSelector:@selector(delayAnimationFromModalViewToMasterView) withObject:nil afterDelay:.1f];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...