Alexander
Alexander

Reputation: 163

How to perform interactive transition with segue?

I have a segue between 2 view controllers.

For dismissing custom interactive transition works fine, but when i perform segue it starts instantly so i can't interact with perform transition. I debugged progress and it shows only 0.0 then segue performs animation

Here's some InteractionController code:

import UIKit

class SlideOutInteractionController: UIPercentDrivenInteractiveTransition {

  var isPresenting = true
  var interactionInProgress = false
  var shouldCompleteTransition = false

  private weak var viewController: UIViewController!
  private weak var gestureView: UIView!

  init(viewController: UIViewController, gestureView: UIView?, isPresenting: Bool) {
    super.init()

    self.isPresenting = isPresenting
    self.viewController = viewController
    if let gestureView = gestureView {
      prepareGestureRecognizer(in: gestureView)
    } else {
      prepareGestureRecognizer(in: viewController.view)
    }
  }

  private func prepareGestureRecognizer(in view: UIView) {
    let gesture = UIPanGestureRecognizer(target: self, action: #selector(handleGesture(_:)))
    view.addGestureRecognizer(gesture)
  }

  @objc func handleGesture(_ gestureRecognizer: UIScreenEdgePanGestureRecognizer) {

    let translation = gestureRecognizer.translation(in: gestureRecognizer.view!.superview)
    let dragAmount =
      isPresenting ? -gestureRecognizer.view!.bounds.size.height : gestureRecognizer.view!.bounds.size.height

    var progress = (translation.y / dragAmount)
    progress = CGFloat(fminf(fmaxf(Float(progress), 0.0), 1.0))

    switch gestureRecognizer.state {

    case .began:

      interactionInProgress = true

      if isPresenting {
        viewController.performSegue(withIdentifier: CardViewController.SegueIdentifier.reveal.rawValue, sender: nil)
      } else {
        viewController.dismiss(animated: true, completion: nil)
      }
    case .changed:
      shouldCompleteTransition = progress > 0.3
      update(progress)

    case .cancelled:
      interactionInProgress = false
      cancel()

    case .ended:
      interactionInProgress = false
      if shouldCompleteTransition {
        finish()
      } else {
        cancel()
      }
    default:
      break
    }
  }
}

Maybe should i use presenting method?

Upvotes: 0

Views: 35

Answers (1)

Alexander
Alexander

Reputation: 163

Solved! It was wrong animator for presenting

Upvotes: 0

Related Questions