#objective-c #ios #core-animation
#objective-c #iOS #ядро-анимация
Вопрос:
Я пытаюсь создать эффект анимации, аналогичный эффекту в Safari (iPhone), когда вы добавляете элемент в список чтения. Он похож на тот, который появляется при запуске загрузки элемента из приложения App Store: элемент приложения падает на док-станцию, чтобы начать загрузку. Сначала он подпрыгивает, а затем отправляется в док. Это очень приятный эффект, который Apple использует в своих ОС.
У меня есть изображение на экране, которое я хочу перенести с помощью такого рода анимации на панель инструментов в моем приложении.
Если есть кто-то, кто это сделал или знает, как называется эффект, пожалуйста, скажите мне, как это сделать.
Спасибо.
Ответ №1:
«Добавить в список чтения» не показывает анимацию на моем телефоне, но по вашему описанию она звучит как «Открыть в фоновом режиме» — анимация в Safari (iPhone). Мой ответ описывает эту анимацию.
Я написал нечто подобное несколько месяцев назад, и многое из этого выполнимо, а некоторые — нет. Ваши вопросы показали мне, что больше людей должны знать, как это делается, поэтому я написал об этом сообщение в блоге. Я опишу здесь высокоуровневый подход и проблемы, но вы можете подробнее прочитать об этом в этом посте.
Переход к контенту для анимации
Если вы решите анимировать вид, который находится на экране, вплоть до (в вашем случае) панели инструментов, вам нужно будет получить доступ только к его слою. Если вы хотите сохранить исходный вид и анимировать визуальную копию (например, анимацию «открыть в фоновом режиме» -Safari) вплоть до элемента панели, тогда вам следует создать новый слой и преобразовать содержимое вашего слоя в изображение и установить это изображение в качестве содержимого слоя, который вы используете.анимация
Вычисление конечной позиции
Начальная позиция анимации — это просто рамка представления. Конечная позиция очень сложна, поскольку элементы панели (как элементы панели инструментов, так и элементы панели вкладок) не являются подклассами UIView и не имеют свойства public view. Это вызывает проблемы, когда вы хотите встряхнуть элемент панели позже.
Я решил сделать визуальное приближение конечной позиции, используя несколько простых эвристик. Если вы заранее знаете, что будете анимировать только один элемент панели, то конечная позиция может быть жестко запрограммирована для подходящего фрейма.
Анимация по пути
Нет ничего особенного в перемещении, масштабировании и повороте слоя от начальной до конечной позиции. Если вы хотите узнать больше о том, как я это сделал, вы можете посмотреть пост, который я написал.
Встряхивание элемента бара
На данный момент это невозможно сделать без большого количества пользовательского кода или использования частного API. Поскольку элементы панели не имеют представления или слоя, у вас нет доступного слоя для анимации. Я предполагаю, что у вас может быть пользовательское анимационное изображение, которое выполняет встряхивание и устанавливает его во время анимации, а затем устанавливает новое изображение. Подход рисования в изображении и анимации, который также не работает так хорошо, поскольку нет доступного слоя, который мог бы нарисовать его содержимое в изображении (вы хотите это для специального эффекта элемента панели инструментов и элемента панели вкладок).