Я хочу анимировать, фактически исчезать, "в пределах" drawRect - PullRequest
8 голосов
/ 19 января 2011

Есть ли способ сделать drawRect анимированным ИЗ ПРЕДЫДУЩЕЙ СЦЕНЫ до следующего?

(Удивительно) Вы можете анимировать внутри drawRect - попробуйте. Вы можете исчезать, переводить или анимировать любое другое свойство.

Тем не менее, он начинается «с нуля», с пустого места. Так, например, если вы поместите блок анимации с постепенным увеличением в drawRect, предыдущая сцена исчезнет и новая Сцена исчезнет с белого.

Я хочу, чтобы экран исчезал с предыдущего изображения (нарисованного в предыдущем цикле drawRect) на новое изображение, которое я только что нарисовал ... ошибаюсь, рисую.

Есть ли способ сделать это, возможно, хитро, манипулируя тем, что происходит с drawRect?

Казалось бы, это очень распространенный вариант использования - , смешивающийся из одной сцены в следующую .

Кто-нибудь знает секрет?

Конечно, очевидно, что это может быть сделано в среде основной анимации или многими другими способами, но очевидна идея иметь затухание drawRect от одного drawRect к другому. Приветствия.

Поразительное обновление благодаря гению WrightCS .....

Благодаря только WrightCS мы теперь знаем, что drawRect отлично справляется с анимацией. Просто вставьте этот код в конец любого drawRect и попробуйте:

self.alpha = 0.0;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2];
self.alpha = 1.0;
[UIView commitAnimations];

он обрабатывает весь drawRect, независимо от того, насколько он сложен, как один огромный блок и оборачивает его в эту анимацию. Да, это даже включает в себя рисование за пределами экрана, рендеринг растровых изображений или что-то еще. Все оживляется. Кто знал?

Проблема под рукой - как заставить его запустить анимацию с предыдущей сцены, а не начинать с пустого места?

Ответы [ 5 ]

4 голосов
/ 25 мая 2012

Слишком поздно, но я тоже искал это, и принятый ответ на этот вопрос работает как заклинание прямо изнутри drawRect.

4 голосов
/ 19 января 2011

Drawrect невидим. Это происходит в «обратном буфере», который iOS отображает на экране, только когда вы готовы с drawRect. Таким образом, вы можете определенно не оживлять в то время как в drawrect. Тем не менее, вы можете передавать инструкции по анимации практически из любого места, включая рисование. Но анимация будет выполнена позже.

Анимация требует времени и показывает пользователю различные кадры.

Вы МОЖЕТЕ сделать это самостоятельно (постоянно заставлять перерисовывать и каждый раз делать что-то немного отличающееся в рисовании), но это большая работа, особенно если вы хотите, чтобы это было сделано правильно.

К счастью, в iOS запрограммировано много анимационных эффектов. Либо с помощью Core Animation, либо (более простой и простой) анимации в UIKit. Но поскольку он работает путем анимации определенных свойств видов (например, альфа-представления целого вида или поворота целого вида, ...), вам, возможно, потребуется изменить порядок своих представлений и подпредставлений, чтобы эффективно его использовать.

например. Каждая конечность лошади - это отдельное подпредставление, и вы анимируете их преобразования (перерисовка не требуется, iOS сделает все остальное)

например. Старый и новый фреймы - это два отдельных вида, и вы анимируете новый фрейм (который находится сверху) от альфа 0 до альфа 1.

2 голосов
/ 19 января 2011

Вы можете анимировать альфа:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:2.0];
myObject.alpha = 0.0;
[UIView commitAnimations];
1 голос
/ 15 февраля 2012

если вы используете iOS 5.0+, вы можете использовать следующее:

...
            [UIView animateWithDuration:0.3 
                                  delay:0.0 
                                options:UIViewAnimationOptionBeginFromCurrentState 
                             animations:^{
                                 //do your stuff here
                             }completion:^(BOOL finished) {
                                 //completition stuff go here
                             }];
...
0 голосов
/ 15 февраля 2012

Лучшее, что вы можете сделать, это использовать два UIView экземпляра и анимировать между ними.

Когда вы запускаете анимацию, вы должны знать, каково исходное и конечное состояние анимации. Это сложно, если это только один вид.

...