![](/img/trans.png)
[英]registerForRemoteNotifications works on iOS9, fails on iOS8
[英]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)
})
}
在動畫之前,我必須使用:initialFrameForViewController
從transitionContext
設置幀,在動畫期間我必須使用:finalFrameForViewController
從transitionContext
設置最終幀。 它阻止了視圖消失,可能它最終獲得了正確的幀值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.