快速交互式过渡-取消过渡时,第二个视图控制器的视图闪烁

时间:2018-11-21 18:20:03

标签: swift flash transition interactive

我正在尝试快速进行自己的互动过渡。在我的示例项目中,我有两个视图控制器。通过我自己的过渡,我可以彼此滑动。我的问题是:当我从第一个视图控制器向第二个视图控制器滑动时,第二个(我想在其中滑动)视图控制器会在屏幕上显示毫秒,这时我确实取消了平移手势的过渡。

我试图通过从第一个视图控制器拍摄快照并在取消过渡时将其放在过渡层上来解决该问题。可以在我的iPhone 8上使用,但是在iPhone XS上,我可以得到相同的闪光灯一毫秒。

仅当我在屏幕上快速滑动时才会出现闪烁。

遇到相同问题的任何人。

PangestureHandler:

@IBAction func HandlePan(_ sender: UIPanGestureRecognizer) {
    let percentThreshold:CGFloat = 0.25

    let translation = sender.translation(in: view)
    var verticalMovement = (translation.y) / view.bounds.height
    verticalMovement = verticalMovement - verticalMovement - verticalMovement
    let downwardMovement = fmaxf(Float(verticalMovement), 0.0)
    let downwardMovementPercent = fminf(downwardMovement, 1.0)
    let progress = CGFloat(downwardMovementPercent)

    let movementToStart: CGFloat = 0.0

    let interactor = self.interactor

    switch sender.state {
    case .began:
        print(".began")
    case .changed:
        print("progress: \(progress)")
        if progress > movementToStart && !interactor.hasStarted {
            interactor.hasStarted = true
            performSegue(withIdentifier: "segueToSecondVC", sender: nil)
            interactor.update(progress - movementToStart)
        }
        if interactor.hasStarted {
            interactor.update(progress - movementToStart)
            interactor.shouldFinish = progress > percentThreshold
        }
    case .cancelled:
        print("cancel")
        interactor.hasStarted = false
        interactor.cancel()
    case .ended:
        interactor.hasStarted = false
        if interactor.shouldFinish {
            interactor.finish()
        } else {
            interactor.cancel()
            print("interactor cancel")
        }

    default:
        break
    }
}

AnimatorClass:

import UIKit

class PresentAnimator: NSObject, UIViewControllerAnimatedTransitioning {




private var myView: UIView!

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

}


func animationEnded(_ transitionCompleted: Bool) {
    if !transitionCompleted {
        self.myView.alpha = 1.0
    }
}

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    guard let fromVC = transitionContext.viewController(forKey: .from), let toVC = transitionContext.viewController(forKey: .to) else { return }
    let containerView = transitionContext.containerView


    let screenBounds = UIScreen.main.bounds
    let startPoint = CGPoint(x: 0, y: UIScreen.main.bounds.height )
    toVC.view.frame = CGRect(origin: startPoint, size: screenBounds.size)
    toVC.view.clipsToBounds = true

    self.myView = fromVC.view.snapshotView(afterScreenUpdates: false)
    containerView.addSubview(myView)
    self.myView.alpha = 0.0

    containerView.insertSubview(toVC.view, aboveSubview: fromVC.view)

    let bottomLeftCorner = CGPoint(x: 0, y: 0)
    let finalFrame = CGRect(origin: bottomLeftCorner, size: screenBounds.size)
    let duration = transitionDuration(using: transitionContext)



    UIView.animate(
        withDuration: duration, delay: 10.0, options: .curveLinear,
        animations: {
            toVC.view.frame = finalFrame
            self.myView.removeFromSuperview()
    },
        completion: { _ in
            self.myView.removeFromSuperview()
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
    })

}

}

0 个答案:

没有答案
相关问题