Как получить доступ к кадру объекта toView в пользовательской анимации

Я хочу сделать анимацию, похожую на папки домашнего экрана iOS, и мне нужно знать кадр конечной позиции «папки»: снимок экрана окончательного вида

Я использую пользовательский переход, и вот код файла анимации:

class FolderAnimationController: NSObject, UIViewControllerAnimatedTransitioning {

    let duration    = 5.0
    var presenting  = true

    func transitionDuration(_ transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return duration
    }

    func animateTransition(_ transitionContext: UIViewControllerContextTransitioning) {

        let containerView = transitionContext.containerView()
        let toViewC = transitionContext.viewController(forKey: UITransitionContextToViewControllerKey)! as! ProjectViewController
        let fromViewC = transitionContext.viewController(forKey: UITransitionContextFromViewControllerKey)!as! ViewController

        let cell : FolderCollectionViewCell = fromViewC.folderCollectionView.cellForItem(at: (fromViewC.folderCollectionView.indexPathsForSelectedItems()?.first!)!) as! FolderCollectionViewCell
        let cellSnapshot: UIView = cell.snapshotView(afterScreenUpdates: false)!
        let cellFrame = containerView.convert(cell.frame, from: cell.superview)
        cellSnapshot.frame = cellFrame
        cell.isHidden = true

        toViewC.view.frame = transitionContext.finalFrame(for: toViewC)
        toViewC.view.alpha = 0
        containerView.addSubview(toViewC.view)
        containerView.addSubview(cellSnapshot)

        UIView.animate(withDuration: duration, animations: {
            toViewC.view.alpha = 1.0

            let finalFrame = containerView.convert(toViewC.containerView.frame, from: toViewC.view)
            cellSnapshot.frame = finalFrame
            }) { (_) in
                cellSnapshot.removeFromSuperview()
                transitionContext.completeTransition(true)
        }

    }
}

Все работает правильно, кроме let finalFrame = containerView.convert(toViewC.containerView.frame, from: toViewC.view), который устанавливает finalFrame значения (является переменной CGRect) равными (origin = (x = 0, y = 0), size = (width = 0, height = 0)).

Я следовал этому руководству, пишу код на Swift.

Итак, как я могу правильно получить доступ к свойству?


person alessionossa    schedule 13.07.2016    source источник


Ответы (1)


Фрейм является нулевым прямоугольником, потому что в тот момент, когда вы обращаетесь к нему, проход макета представления не произошел. После того, как вы установите кадр toVC.view, добавьте эту строку:

toVC.view.layoutIfNeeded()

Я писал об использовании моментальных снимков в переходах контроллера представления здесь если вам интересно.

person jrturton    schedule 15.07.2016
comment
Я хочу получить доступ к toViewC.containerView.frame, то есть к правой части папки, как вы можете видеть на скриншоте. Я удалил преобразование, но оно не работает... - person alessionossa; 15.07.2016
comment
Но если я отправлю false в completeTransition, я вернусь к своему первому просмотру - person alessionossa; 18.07.2016
comment
Тьфу, я проделал ужасную работу над этим ответом для вас. Извините, я тоже ошибся. - person jrturton; 18.07.2016