两个视图之间的转换适用于iOS8但不适用于iOS9

时间:2015-11-10 14:25:34

标签: ios swift ios8.1 catransition ios9.1

我现在已经尝试了几个小时来完成两个视图之间的过渡动​​画工作。一直出现的问题,当我得到代码在ios8.1上工作时,它停止在ios9.1上运行,反之亦然。问题只是我想要转换的视图消失了。我知道有很多这样的主题,但没有一个答案对我有用,它总是有助于一个版本的ios而另一个版本对它无效。 我已经在某地读到动画的问题不能正常工作,我使用的是AutoLayout,其中一个解决方案就是使用图层转换,这就是为什么我以一个适用于iOS8的代码版本结束的原因现在不适用于iOS9 ...... 这是我使用的代码,适用于iOS8

 class ChannelDetailsCollectionViewController: UICollectionViewController {
     @IBAction func backButtonPressed(sender: AnyObject) {
            self.navigationController?.popViewControllerAnimated(true)
        }
    }

class UIAnimatedNavigationControllerDelegate: NSObject, UINavigationControllerDelegate {
func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
    if operation == .Push {
        return SlideInAnimator()
    } else if operation == .Pop {
        return SlideInDismissAnimator()
    } else {
        return nil
    }
}


 func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

    let containerView = transitionContext.containerView()!
    let toView = transitionContext.viewForKey(UITransitionContextToViewKey)!
    let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)!

    let duration = self.transitionDuration(transitionContext)

    containerView.addSubview(toView)

    let transition = CATransition()
    transition.startProgress = 0
    transition.endProgress = 1
    transition.speed  = 3.0
    transition.type = kCATransitionPush
    transition.subtype = kCATransitionFromLeft
    transition.duration = 1.0

    fromView.layer.addAnimation(transition, forKey:"transition")
    toView.layer.addAnimation(transition, forKey:"transition")

    fromView.hidden = true
    toView.hidden = false
    transitionContext.completeTransition(true)
}

这是适用于iOS9的内容在这个版本中,我看到当调用toView.transform = CGAffineTransformIdentity时,视图会在iOS8中消失,我认为是因为autolayout。我已经尝试检查nil视图并再次添加它们但它仍然无法正常工作。

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    let container = transitionContext.containerView()
    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
    let fromView = fromViewController!.view
    let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
    let toView = toViewController!.view

    toView.transform = getSlideTransform(toView, offset: -container!.frame.width)
    fromView.transform = getSlideTransform(toView, offset: 0.0)
    container!.addSubview(toView)
    container!.addSubview(fromView)


    let duration = self.transitionDuration(transitionContext)

    UIView.animateWithDuration(duration, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.8, options: [], animations: {

        toView.transform = CGAffineTransformIdentity
        fromView.transform = self.getSlideTransform(fromView, offset: fromView.frame.width+100)
        }, completion: { finished in

            transitionContext.completeTransition(true)
    })
}


private func getSlideTransform(view: UIView, offset: CGFloat) -> CGAffineTransform {

    let size = view.frame.size
    var offSetTransform = CGAffineTransformMakeTranslation(offset, 0)
    offSetTransform = CGAffineTransformScale(offSetTransform, 0.9, 0.9)

    return offSetTransform
}

有人可以给我一些提示现在尝试一下吗?因为我没有想法,正如我所说的那样,我所检查的所有主题都可以解决一个iOS版本的问题,并使另一个版本崩溃:/

1 个答案:

答案 0 :(得分:2)

因此,经过几个小时的尝试后,我得到的代码可以在iOS8和iOS9上运行。

我为任何可能遇到类似问题的人发布工作代码并且无法对此采取任何措施

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
    let container = transitionContext.containerView()
    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
    let fromView = fromViewController!.view
    let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
    let toView = toViewController!.view

    let duration = self.transitionDuration(transitionContext)

toView.frame = transitionContext.initialFrameForViewController(toViewController!)
fromView.frame = transitionContext.initialFrameForViewController(fromViewController!)

toView.transform = getSlideTransform(toView, offset: -container!.frame.width)
fromView.transform = getSlideTransform(toView, offset: 0.0)
container!.addSubview(toView)


UIView.animateWithDuration(duration, delay: 0.0, usingSpringWithDamping: 0.9, initialSpringVelocity: 0.8, options: [], animations: {
fromView!.removeFromSuperview()
toView.transform = CGAffineTransformIdentity
fromView.transform = self.getSlideTransform(fromView, offset: fromView.frame.width)
toView.frame = transitionContext.finalFrameForViewController(toViewController!)
fromView.frame = transitionContext.finalFrameForViewController(fromViewController!)

    }, completion: { finished in

transitionContext.completeTransition(true)
})
}

在动画之前,我必须使用transitionContext:initialFrameForViewController设置帧,在动画期间,我必须使用transitionContext:finalFrameForViewController设置最终帧。它阻止了视图消失,可能最终得到了正确的帧值。