Базовая анимация с графикой Core Graphics - PullRequest
2 голосов
/ 14 января 2009

Я нахожусь внутри подкласса UIView (CustomView в коде ниже).

Я рисую границу вокруг изображения в подклассе UIImageView (containerView). Код Core Graphics для этого находится внутри drawInRect: в подклассе.

Переход Core Animation является переворотом, однако при его отрисовке код Core Graphics не используется, т. Е. drawInRect: не вызывается, чтобы предоставить CALayer мое отрендеренное изображение.

Вместо этого я получаю анимацию от одного изображения к другому без прорисовки Core Graphics.

Как мне разрешить анимировать CALayer, используя мой графический рисунок Core, а не необработанное изображение?

[CustomView beginAnimations:@"transitionNextImage" context:nil];
[CustomView setAnimationDuration:2.0];
[containerView setImage:image];
[CustomView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[containerView setImage:differentImage];
[CustomView commitAnimations];

Ответы [ 2 ]

3 голосов
/ 15 января 2009

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

Проблема заключалась в том, что CALayer для рисования не вызывал drawRect: внутри подкласса UIImageView.

Поэтому, когда я переключил родителя этого подкласса на UIView, реализовал собственное свойство для изображения, а также настроил анимацию - все сошлось.

Анимация containerView в приведенном выше коде была изменена, чтобы быть ванильным UIView экземпляром. Код анимации должен был быть немного изменен, чтобы приспособиться к этому:

[CustomView beginAnimations:@"transitionNextImage" context:nil];
[CustomView setAnimationDuration:2.0];
[containerView addSubview:aViewSubclass];
[CustomView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:containerView cache:YES];
[aViewSubclass removeFromSuperview];
[containerView addSubview:anotherInstanceOfTheViewSubclass];
[CustomView commitAnimations];

т.е. из документов Apple об этих видах переходов:

Если вы хотите изменить внешний вид зрения во время перехода - для Например, перевернуть из одного вида в другой - затем используйте вид контейнера, Экземпляр UIView, следующим образом:

  1. Начните анимационный блок.
  2. Установить переход в представлении контейнера.
  3. Удалить подпредставление из представления контейнера.
  4. Добавить новое подпредставление в представление контейнера.
  5. Зафиксировать блок анимации.
2 голосов
/ 14 января 2009

Вы реализуете drawRect:, а не drawInRect:, верно? Кроме того, вы убедились, что за пределами этого перехода он действительно работает?

Можете ли вы вставить свою drawRect: реализацию? Я просто боюсь, что UIImageView устанавливает содержимое своего слоя напрямую, вместо того, чтобы полагаться на drawRect:, что означает, что ваш drawRect: не работает.

На самом деле, учитывая, насколько все просто, я бы порекомендовал вам просто подкласс UIView вместо UIImageView. Математика сохранения пропорций при масштабировании изображения для рисования довольно проста.

Другим вариантом является, конечно, создание подкласса UIImageView, а затем просто переопределить setImage:, чтобы создать новое изображение на основе первого, но нарисовать границу вокруг него, а затем передать его супер. Таким образом, вам вообще ничего не нужно делать с drawRect:.

...