簡體   English   中英

兩個視圖之間的轉換適用於 iOS8 但不適用於 iOS9

[英]Transition between two views works on iOS8 but not on iOS9

我已經嘗試了幾個小時來讓兩個視圖之間的過渡動​​畫工作。 一直出現的問題是,當我讓代碼在 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 中消失,我認為這是因為自動布局。 我試過檢查 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 的問題,並使另一個版本崩潰:/

因此,經過幾個小時的嘗試,我讓代碼可以在 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)
})
}

在動畫之前,我必須使用:initialFrameForViewControllertransitionContext設置幀,在動畫期間我必須使用:finalFrameForViewControllertransitionContext設置最終幀。 它阻止了視圖消失,可能它最終獲得了正確的幀值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM