简体   繁体   中英

Custom Presentation transition broke on iOS13

I have this CollectionView with small images and a UIViewController with single image on the center of a screen with full-screen width.

When user taps on small image it should scale to take full screen width. There's a custom transition animation between those two.

let previewVC = PreviewTutorialViewController(image: image!, imageFrame: frame, text: data!.text, imageView: cell.toDoImageView)
previewVC.modalPresentationStyle = .overCurrentContext
previewVC.transitioningDelegate = previewVC
self.present(previewVC, animated: true, completion: nil)

AnimationController

class AnimationController: NSObject, UIViewControllerAnimatedTransitioning {
    var duration = 10.4
    var isPresenting: Bool

    init(forTransitionType type: TransitionType) {
        self.isPresenting = type == .presenting
        super.init()
    }

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


    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let containerView = transitionContext.containerView

        let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
        let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!

        var imageRectAfter : CGRect = .zero
        var imageRectInitial : CGRect = .zero

        var previewTutorialVC : PreviewTutorialViewController?

        if self.isPresenting {
            containerView.addSubview(toVC.view)
            containerView.layoutIfNeeded()
            previewTutorialVC = (toVC as! PreviewTutorialViewController)
            imageRectInitial = previewTutorialVC!.initialRect
            imageRectAfter = previewTutorialVC!.tutorialImageView.frame
            previewTutorialVC?.initialImageView?.alpha = 0
            print("$$$ animating image view frame : PRESENTING ", imageRectInitial, " to ", imageRectAfter)
        } else {
            previewTutorialVC = (fromVC as! PreviewTutorialViewController)
            imageRectAfter = previewTutorialVC!.initialRect
            imageRectInitial = previewTutorialVC!.tutorialImageView.frame
            print("$$$ animating image view frame : DISSMISSING ", imageRectInitial, " to ", imageRectAfter)
            //let frame2 = previewTutorialVC!.tutorialImageView.convert(imageRectInitial, to: containerView)
            //imageRectInitial = CGRect(x: 0, y: 430, width: 414, height: 155)
            //print("$$$ converted :", frame2)
            print("$$$ ", containerView.bounds.size.width, previewTutorialVC?.view.bounds.size.width)
        }

        previewTutorialVC?.tutorialImageView.transform = .identity

        previewTutorialVC?.tutorialImageView.frame = imageRectInitial
        previewTutorialVC?.containerView.alpha = isPresenting == true ? 0 : 1
        previewTutorialVC?.closeButton.alpha = self.isPresenting == true ? 0 : 1

        //previewTutorialVC?.textContainerView.transform = isPresenting == true ? CGAffineTransform(translationX: 0, y: previewTutorialVC?.textContainerView.frame.size.height ?? 0) : .identity

        UIView.animate(withDuration: duration, delay: 0, options: [.curveEaseOut], animations: {
            previewTutorialVC?.tutorialImageView.frame = imageRectAfter
            previewTutorialVC?.containerView.alpha = self.isPresenting == true ? 1 : 0
            previewTutorialVC?.closeButton.alpha = self.isPresenting == true ? 1 : 0
       //     previewTutorialVC?.textContainerView.transform = self.isPresenting == true ? .identity : CGAffineTransform(translationX: 0, y: previewTutorialVC?.textContainerView.frame.size.height ?? 0)
        }) { (_) in
            if self.isPresenting == false { previewTutorialVC?.initialImageView?.alpha = 1 }
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        }
    }
}

Console log:

$$$ animating image view frame : PRESENTING  (15.0, 461.5, 384.0, 143.5)  to  (0.0, 370.5, 414.0, 155.0)
$$$ animating image view frame : DISSMISSING  (0.0, 370.5, 414.0, 155.0)  to  (15.0, 461.5, 384.0, 143.5)

It used to work fine, but since iOS 13 i've noticed dismiss animation starts with way too wide image than it should be, although frame prints correct values.. also dismiss animation ends with image being a bit too high.Present animation's working fine

previewTutorialVC?.tutorialImageView.translatesAutoresizingMaskIntoConstraints = true 

this inside dismiss block fixed the issue. As mentioned here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM