UIViewControllerContextTransitioning не даст мне ViewController

-5

Я столкнулся с непостижимой проблемой. У меня есть 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
}

Моя БОЛЬШАЯ проблема заключается в том, что мое выполнение входит в другое, потому что он не может найти FromVC из transitionContext.viewController. И вот как я называю свою галерею

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
})
}

Это то, что я получаю от переходного контекста:

Return

Почему переходContext не даст мне правильный VC?

спросил(а) 2021-01-19T15:56:18+03:00 6 месяцев, 2 недели назад
1
Решение
64

Ну, я проверил и заметил, что transitionContext.viewController(forKey:.from) - это NavigationController.

В строке: let fromVC = transitionContext.viewController(forKey:.from) as? NavigationGalleryViewController fromVC = transitionContext.viewController(forKey:.from) as? NavigationGalleryViewController должен быть nil, потому что это не NavigationGalleryViewController, а NavigationController.

Если вы хотите, вы можете сделать smth следующим образом: let fromVC = transitionContext.viewController(forKey:.from).childViewControllers.first as? NavigationGalleryViewController let fromVC = transitionContext.viewController(forKey:.from).childViewControllers.first as? NavigationGalleryViewController

ответил(а) 2021-01-19T15:56:18+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема