Вот несколько заметок о том, как эта головоломка была решена, и о том, как ответы каждого из них послужили частью головоломки.
Чтобы еще раз сформулировать проблему: когда я добавил анимацию ключевого кадра к ключу @contents
CALayer, между исходным свойством содержимого и первым кадром анимации ключевого кадра произошел переход в 25 секунд. Это выглядело плохо, и я хотел избавиться от этого.
Сначала я наверняка подумал, что, используя CATransaction, я смогу подавить эту неявную анимацию перехода, так как именно это заставляет вас верить документам Apple. Используя транзакцию, я подавлял все возможные способы, которые вы могли себе представить, и все же это все еще происходило. Затем я попытался вернуть NULL-анимацию для каждого анимируемого свойства через словарь. Неудачно. Затем я сделал то же самое, но с делегатом. Все еще не повезло.
Что я не упомянул, так это то, что в то же время добавлялась анимация и слой перемещался, два подслоя под ним удалялись из их суперслоев. Я попытался добавить пользовательские анимации для клавиши onOrderOut, но безрезультатно. Затем я наткнулся на еще один вопрос здесь, в StackOverflow, о добавлении пользовательской анимации для ключа onOrderOut. Проще говоря, это невозможно, и если вы хотите реализовать какую-то другую анимацию для удаления подслоя, вы должны использовать метод delagate animationDidStop. Как я могу использовать пользовательские анимации для onOrderOut в Core Animation?
Так что в этот момент я был убежден, что это изображение-призрак не имеет никакого отношения к реальному слою, о котором идет речь, к самому спрайту. Чтобы проверить это, я просто не добавил подслои, которые шли под ним. Конечно же, когда я переместил спрайт, не было никакого затянувшегося призрака. Выглядело идеально. Затем я добавил слои под призраком. Это было почти так, как будто содержимое спрайта было нарисовано в слоях под ним, так что, когда они были удалены, был какой-то отпечаток.
Вместо удаления подслоев я просто пытался их скрыть. Бинго. Это было идеально. Произошел такой же переход замирания, но не осталось отпечатка спрайта. Я до сих пор не понимаю, почему это так.
Затем, поскольку мне все еще нужно было удалить эти слои, я реализовал метод делегата animationDidStop для различных анимаций движения спрайта, чтобы удалить их.
Это оригинал:
Это новая версия:
Поэтому, хотя я технически не понимаю, почему появляется отпечаток, я почти уверен, что это касается того, что происходит за кулисами при удалении подслоя. Кроме того, ради интереса, я все еще хотел, чтобы этот подслой был скрыт при запуске анимации, поэтому я просто установил его на скрытый и предоставил свою собственную анимацию перехода.
Так что спасибо всем за помощь. Я знаю, что это странный вариант использования, но если вы когда-нибудь задумывались о том, чтобы сделать 2-граммовый финал Final Fantasy Tactics на основе спрайтов, то, надеюсь, моя боль будет вам полезна!