Пользовательские переходы ViewController: получить фрейм подпредставления ToViewController

Вот иллюстрация моего вопроса:

иллюстрация

У меня есть StarImageView в ViewControllers A & B, который отображает одно и то же изображение, но имеет разные кадры друг от друга в своем ViewController.

При нажатии StarImageView в ViewController A приложение помещает новый контроллер представления в стек контроллера навигации и в то же время выполняет анимацию до своего последнего кадра в ViewController B.

Это поведение аналогично переходу в приложении iPhone Фото.


Как я это делаю сейчас

Я инициализирую временный UIImageView в объекте-аниматоре с исходным кадром StarImageView и изображением в ViewController A, и анимирую его в окончательный кадр путем жесткого кодирования прямоугольника CGRectMake(0, 60+44, containerView.bounds.size.width, containerView.bounds.size.width) (кадр StarImageView в ViewController B) и удаление временного UIImageView из суперпредставления в блоке завершения анимации.


Как я хочу сделать это вместо

Проект создается в раскадровке с включенной авторазметкой. То, что я хочу сделать, это получить кадр StarImageView в ViewController B во время перехода, а не жестко кодировать его, как описано выше. Из-за жизненного цикла ViewContorller я не могу ссылаться на какие-либо подпредставления в ViewController B в объекте аниматора, так как они еще не были инициализированы.

Есть ли другие решения или лучшие практики для таких ситуаций? Заранее спасибо!

PS Я видел это, это и это, но не повезло в ответе.

2 ответа

Напишите следующий код в своем классе анимации

 func animateTransition(using transitionContext: UIViewControllerContextTransitioning)
    {
        let containerView = transitionContext.containerView
        let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!

  let yourVC = (toVC as! UINavigationController).viewControllers[0] as! YourVC;
        yourVC.view.layoutIfNeeded();
        destinationFrame = yourVC.youImageView.frame /*rest of code*/}

он получит кадр изображения в контроллере вида назначения.

[toViewController.view layoutIfNeeded];

Другие вопросы по тегам