Перекрестное затухание между 3 изображениями в UIButton на iOS

Я пытаюсь реализовать кликабельное изображение, которое может многократно переключаться между тремя или более изображениями. Мне не нужно взаимодействовать с изображениями после настройки цикла. Цикличность основана на времени, а не на событии. Изображения должны плавно переходить из одного в другое.

Как лучше всего подойти к этой проблеме?

Моим первым подходом был конечный автомат в одном методе и объединение UIView анимационных блоков вместе с помощью селектора этого метода. Это не удалось, так как [button setImage:nextImage forState:UIControlStateNormal] не анимирован.

Мой второй подход состоял в том, чтобы посмотреть на CABasicAnimation и слои. Это казалось более низкоуровневым подходом, но я не видел способа связать переходы вместе (например, установить следующее действие после завершения этого действия).

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

Как плавно переходить между изображениями в UIButton?

Как связать эти переходы вместе?

Каков правильный путь?

Изменить: изображения i1, i2, i3 должны идти в последовательности i1 -> i2 -> i3 -> i2 -> i1 -> i2 -> i3 и т. д.


person jamesh    schedule 28.06.2010    source источник


Ответы (3)


Моя первая мысль UIImageView.animationImages, но я не думаю, что это поддерживает затухание.

Не используйте UIButton для отображения изображения; просто сделайте его невидимой кнопкой поверх чего-то еще, что обрабатывает рисунок.

Один из простых способов сделать анимацию, которую вы хотите, — это использовать два представления изображения: переместите «затухающий» вид изображения на передний план (-[UIView bringSubviewToFront:]), установите его альфа-канал на 0, а затем анимируйте его альфа-канал на 1.

person tc.    schedule 28.06.2010

Мое решение:

  • Имейте UIButton и контейнер UIView.
  • Контейнер UIView содержал все изображения в виде UIImageView дочерних представлений.
  • Запустите анимацию в методе viewDidAppear UIViewController, где для всех дочерних представлений альфа установлена ​​на 1.0. Затем установите для 0-го альфа-канала изображения значение 1.0.
  • Когда эта анимация закончится, вспомните тот же метод, который устанавливает задержку
  • и заботится об анимации следующего изображения.

Я не уверен, что это правильный способ сделать что-то, но он казался намного более аккуратным, чем альтернатива -

  • все изображения могут быть настроены в Interface Builder без какого-либо загрязнения имен изображений в коде.
  • метод был автономным, и управление памятью не вызывало затруднений.
person jamesh    schedule 28.06.2010

Я совершенно уверен, что что-то вроде этого будет работать:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:duration];

[button setImage:whicheverImage forState:UIControlStateNormal];

[UIView commitAnimations];

Он должен плавно исчезать, если вы дадите ему продолжительность, может быть, 0,5 (секунды).

person Luke    schedule 01.07.2010
comment
Есть некоторые операции, которые не анимируются должным образом, например. кнопка.скрытый = ДА; setImage и связанное с ним свойство — это другое. - person jamesh; 05.07.2010