Анимация подвью в интерактивном переходе от UITableView к UIView

Для приложения только для iOS7 у меня есть UITableView (хотя было бы академично изменить его на UICollectionView, если это поможет), где ячейки выглядят следующим образом:

+----------------------------------+=======+
| Label1                           | sub-  |
| Label2     Label3                | view  |
+----------------------------------+=======+

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

          +----------+
          |          |
          | subview  |
          |          |
          +----------+
             Label1
             Label2
             Label3

Это похоже на приложение календаря iOS7, в котором представления переходят и оживляют детали на этом пути. Я знаю, что мне нужно реализовать UIViewControllerAnimatedTransitioning, но у меня есть концептуальные проблемы с тем, как это работает. Скрыть скрытые подъязыки ячеек, заменить их на новые просмотры представлений, но там же, а затем оживить их? Или есть менее запутанный путь? Любой образец кода был бы оценен, так как все примеры, которые я нашел, не переносят подпрограммы из одного представления в другое.

ETA: Чем больше я думаю об этом, тем больше мне интересно: лучше ли это обрабатывать с помощью UICollectionView с раскладкой потока и просто детализировать анимированное изменение размера ячейки до полного размера экрана

Ответ 1

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

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

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

  • Добавить входящий просмотр в иерархию вашего представления.
  • Создайте пустой холст в верхней части этого
  • Создайте моментальный снимок вашего исходящего представления и добавьте его на холст
  • Создайте снимок вашего входящего представления и добавьте его в холст
  • Выполните анимацию между двумя
  • Удалить холст

Поскольку макет уже произошел, вы можете использовать свойства center или frame ваших существующих представлений на этих моментальных снимках и просто анимировать их. Это делает код намного легче читать. Это то, о чем говорит вышеприведенный комментарий Augie.

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

Я сделал пример проекта с этим переходом, доступный на GitHub. Окончательный эффект выглядит следующим образом:

example video

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