我已经创建了一个转换,它工作正常,除了我在模拟器中有时会出现黑角.此外,在iPad Pro中,如果我以全分辨率运行模拟器,我会得到一个完全黑屏.调整大小的决议工作正常.你知道可能是什么问题吗?我认识到的另一件事是黑屏幕背后的内容就在那里,并对触摸做出响应.例如,在触摸时我重新加载了集合视图的单元格.然后,此单元格可见,而其余的集合视图为黑色.
class ZoomInCircleViewTransition: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate {
    var transitionContext: UIViewControllerContextTransitioning?
    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        return 0.6
    }
    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        self.transitionContext = transitionContext
        guard let toViewController: UIViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) else {
            return
        }
        guard let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) else {            return
        }
        guard let fromViewTransitionFromView = fromViewController as? TransitionFromViewProtocol else {
            return
        }
        let imageViewSnapshot = fromViewTransitionFromView.getViewForTransition()
        let endFrame = CGRectMake(-CGRectGetWidth(toViewController.view.frame)/2, -CGRectGetHeight(toViewController.view.frame)/2, CGRectGetWidth(toViewController.view.frame)*2, CGRectGetHeight(toViewController.view.frame)*2)
        if let containerView = transitionContext.containerView(){
            containerView.addSubview(fromViewController.view)
            containerView.addSubview(toViewController.view)
            containerView.addSubview(imageViewSnapshot)
        }
        let maskPath = UIBezierPath(ovalInRect: imageViewSnapshot.frame)
        let maskLayer = CAShapeLayer()
        maskLayer.frame = toViewController.view.frame
        maskLayer.path = maskPath.CGPath
        toViewController.view.layer.mask = maskLayer
        let quadraticEndFrame = CGRect(x: endFrame.origin.x - (endFrame.height - endFrame.width)/2, y: endFrame.origin.y, width: endFrame.height, height: endFrame.height)
        let bigCirclePath = UIBezierPath(ovalInRect: quadraticEndFrame)
        let pathAnimation = CABasicAnimation(keyPath: "path")
        pathAnimation.delegate = self
        pathAnimation.fromValue = maskPath.CGPath
        pathAnimation.toValue = bigCirclePath
        pathAnimation.duration = transitionDuration(transitionContext)
        maskLayer.path = bigCirclePath.CGPath
        maskLayer.addAnimation(pathAnimation, forKey: "pathAnimation")
        let hideImageViewAnimation =  {
            imageViewSnapshot.alpha = 0.0
        }
        UIView.animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: hideImageViewAnimation) { (completed) -> Void in
        }
        let scaleImageViewAnimation = {
            imageViewSnapshot.frame = quadraticEndFrame
        }
        UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: scaleImageViewAnimation) { (completed) -> Void in
            // After the complete animations hav endet
            imageViewSnapshot.removeFromSuperview()
        }
    }
    override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
        if let transitionContext = self.transitionContext {
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
        }
    }
    // MARK: UIViewControllerTransitioningDelegate protocol methods
    // return the animataor when presenting a viewcontroller
    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return self
    }
    // return the animator used when dismissing from a viewcontroller
    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return self
    }
}
完成自定义过渡动画后,您需要删除蒙版图层.
toViewController.view.layer.mask = nil
请使用此更新的代码:
class ZoomInCircleViewTransition: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate {
var transitionContext: UIViewControllerContextTransitioning?
func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
    return 0.6
}
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    self.transitionContext = transitionContext
    guard let toViewController: UIViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) else {
        return
    }
    guard let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) else {            return
    }
    guard let fromViewTransitionFromView = fromViewController as? TransitionFromViewProtocol else {
        return
    }
    let imageViewSnapshot = fromViewTransitionFromView.getViewForTransition()
    let endFrame = CGRectMake(-CGRectGetWidth(toViewController.view.frame)/2, -CGRectGetHeight(toViewController.view.frame)/2, CGRectGetWidth(toViewController.view.frame)*2, CGRectGetHeight(toViewController.view.frame)*2)
    if let containerView = transitionContext.containerView(){
        containerView.addSubview(fromViewController.view)
        containerView.addSubview(toViewController.view)
        containerView.addSubview(imageViewSnapshot)
    }
    let maskPath = UIBezierPath(ovalInRect: imageViewSnapshot.frame)
    let maskLayer = CAShapeLayer()
    maskLayer.frame = toViewController.view.frame
    maskLayer.path = maskPath.CGPath
    toViewController.view.layer.mask = maskLayer
    let quadraticEndFrame = CGRect(x: endFrame.origin.x - (endFrame.height - endFrame.width)/2, y: endFrame.origin.y, width: endFrame.height, height: endFrame.height)
    let bigCirclePath = UIBezierPath(ovalInRect: quadraticEndFrame)
    let pathAnimation = CABasicAnimation(keyPath: "path")
    pathAnimation.delegate = self
    pathAnimation.fromValue = maskPath.CGPath
    pathAnimation.toValue = bigCirclePath
    pathAnimation.duration = transitionDuration(transitionContext)
    maskLayer.path = bigCirclePath.CGPath
    maskLayer.addAnimation(pathAnimation, forKey: "pathAnimation")
    let hideImageViewAnimation =  {
        imageViewSnapshot.alpha = 0.0
    }
    UIView.animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: hideImageViewAnimation) { (completed) -> Void in
    }
    let scaleImageViewAnimation = {
        imageViewSnapshot.frame = quadraticEndFrame
    }
    UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: scaleImageViewAnimation) { (completed) -> Void in
        // After the complete animations hav endet
        imageViewSnapshot.removeFromSuperview()
        toViewController.view.layer.mask = nil
    }
}
override func animationDidStop(anim: CAAnimation, finished flag: Bool) {
    if let transitionContext = self.transitionContext {
        transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
    }
}
// MARK: UIViewControllerTransitioningDelegate protocol methods
// return the animataor when presenting a viewcontroller
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    return self
}
// return the animator used when dismissing from a viewcontroller
func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    return self
}
}
| 归档时间: | 
 | 
| 查看次数: | 1499 次 | 
| 最近记录: |