UIViewControllerContextTransitioning没有给我一个ViewController

时间:2018-01-12 13:28:23

标签: ios swift

我面临一个难以理解的问题,我有一个CollectionViewController,我想制作一个自定义动画。 我的收藏是一个画廊,我想从收藏库切换。到全屏画廊。

所以我有ControllerTransitionDelegate

extension NavigationGalleryViewController: UIViewControllerTransitioningDelegate {

func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
    return DimmingPresentationController(presentedViewController: presented, presenting: presenting)
}

func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    guard let selectedCellFrame = self.collectionView?.cellForItem(at: IndexPath(item: index, section: 0))?.frame else { return nil }
    return PresentingAnimator(pageIndex: index, originFrame: selectedCellFrame)
}

我的DimmingPresentationController

class DimmingPresentationController: UIPresentationController {

lazy var background = UIView(frame: .zero)

override var shouldRemovePresentersView: Bool {
    return false
}
override func presentationTransitionWillBegin() {
    setupBackground()
    // Grabing the coordinator responsible for the presentation so that the background can be animated at the same rate
    if let coordinator = presentedViewController.transitionCoordinator {
        coordinator.animate(alongsideTransition: { (_) in
            self.background.alpha = 1
        }, completion: nil)
    }
}
    private func setupBackground() {
    background.backgroundColor = UIColor.black
    background.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    background.frame = containerView!.bounds
    containerView!.insertSubview(background, at: 0)
    background.alpha = 0
}

}

我的动画师

class PresentingAnimator: NSObject, UIViewControllerAnimatedTransitioning {

private let indexPath: IndexPath
private let originFrame: CGRect
private let duration: TimeInterval = 0.5

init(pageIndex: Int, originFrame: CGRect) {
    self.indexPath = IndexPath(item: pageIndex, section: 0)
    self.originFrame = originFrame
    super.init()
}

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

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {

    guard let toView = transitionContext.view(forKey: .to),
        let fromVC = transitionContext.viewController(forKey: .from) as? NavigationGalleryViewController, // The problem is here ! 
        let fromView = fromVC.collectionView?.cellForItem(at: indexPath) as? InstallationViewCell
        else {
            transitionContext.completeTransition(true)
            return
    }

 // All the animation things
 }

我的大问题是我的执行进入了else,因为他无法从transitionContext.viewController中找到FromVC。 这就是我如何称呼我的画廊

gallery = SwiftPhotoGallery(delegate: self, dataSource: self)

    // Gallery visual colours stuff
    gallery.modalPresentationStyle = .custom
    gallery.transitioningDelegate = self

    present(gallery, animated: true, completion: { () -> Void in
        self.gallery.currentPage = self.index
    })
}

这是我从transitionContext收到的:

Return

为什么transitionContext不能给我合适的VC?

1 个答案:

答案 0 :(得分:1)

好吧,我查了一下,发现transitionContext.viewController(forKey: .from)是NavigationController。

符合:让fromVC = transitionContext.viewController(forKey: .from) as? NavigationGalleryViewController为零,因为它不是NavigationGalleryViewController而是NavigationController。

如果你想要,你可以这样做:let fromVC = transitionContext.viewController(forKey: .from).childViewControllers.first as? NavigationGalleryViewController

相关问题