我已經實現了一個導航控制器,以便結合旋轉盤類型的佈局(將每個VC佈局成一個整體旋轉的圓形視圖)。控制器被配置爲使用自定義的過渡類,如下圖所示: -Swift 3中的自定義轉換不能正確轉換
import UIKit class RotaryTransition: NSObject, UIViewControllerAnimatedTransitioning { let isPresenting :Bool let duration :TimeInterval = 0.5 let animationDuration: TimeInterval = 0.7 let delay: TimeInterval = 0 let damping: CGFloat = 1.4 let spring: CGFloat = 6.0 init(isPresenting: Bool) { self.isPresenting = isPresenting super.init() } func animateTransition(using transitionContext: UIViewControllerContextTransitioning) { //Get references to the view hierarchy let fromViewController: UIViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)! let toViewController: UIViewController = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)! let sourceRect: CGRect = transitionContext.initialFrame(for: fromViewController) let containerView: UIView = transitionContext.containerView if self.isPresenting { // Push //1. Settings for the fromVC ............................ // fromViewController.view.frame = sourceRect fromViewController.view.layer.anchorPoint = CGPoint(x: 0.5, y: 3); fromViewController.view.layer.position = CGPoint(x: fromViewController.view.frame.size.width/2, y: fromViewController.view.frame.size.height * 3); //2. Setup toVC view........................... containerView.insertSubview(toViewController.view, belowSubview:fromViewController.view) toViewController.view.layer.anchorPoint = CGPoint(x: 0.5, y: 3); toViewController.view.layer.position = CGPoint(x: toViewController.view.frame.size.width/2, y: toViewController.view.frame.size.height * 3); toViewController.view.transform = CGAffineTransform(rotationAngle: 15 * CGFloat(M_PI/180)); //3. Perform the animation............................... UIView.animate(withDuration: animationDuration, delay:delay, usingSpringWithDamping: damping, initialSpringVelocity: spring, options: [], animations: { fromViewController.view.transform = CGAffineTransform(rotationAngle: -15 * CGFloat(M_PI/180)); toViewController.view.transform = CGAffineTransform(rotationAngle: 0); }, completion: { (animated: Bool) ->() in transitionContext.completeTransition(true) }) } else { // Pop //1. Settings for the fromVC ............................ fromViewController.view.frame = sourceRect fromViewController.view.layer.anchorPoint = CGPoint(x: 0.5, y: 3); fromViewController.view.layer.position = CGPoint(x: fromViewController.view.frame.size.width/2, y: fromViewController.view.frame.size.height * 3); //2. Setup toVC view........................... // toViewController.view.frame = transitionContext.finalFrame(for: toViewController) toViewController.view.layer.anchorPoint = CGPoint(x: 0.5, y: 3); toViewController.view.layer.position = CGPoint(x: toViewController.view.frame.size.width/2, y: toViewController.view.frame.size.height * 3); toViewController.view.transform = CGAffineTransform(rotationAngle: -15 * CGFloat(M_PI/180)); containerView.insertSubview(toViewController.view, belowSubview:fromViewController.view) //3. Perform the animation............................... UIView.animate(withDuration: animationDuration, delay:delay, usingSpringWithDamping: damping, initialSpringVelocity: spring, options: [], animations: { fromViewController.view.transform = CGAffineTransform(rotationAngle: 15 * CGFloat(M_PI/180)); toViewController.view.transform = CGAffineTransform(rotationAngle: 0); }, completion: { //When the animation is completed call completeTransition (animated: Bool) ->() in transitionContext.completeTransition(true) }) } } func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval { return duration; } }
的意見如何運動的表示是顯示在下面......兩個紅色區域是問題,後面會解釋插圖
。呈現(推)翻譯工作正常 - 2移動到1和3移動到2.然而,解僱(流行)翻譯沒有,從而解僱VC看起來正確地移動(2移動到3),但呈現(前一個)VC到達或者在錯誤的地方或者尺寸大小不正確的地方...
與類一樣,翻譯導致2移動到3(正確),但是1移動到4該視圖的尺寸正確,但似乎偏離了預期位置的看似任意的距離。我從此嘗試了各種不同的解決方案。
在彈出部我試圖將下面的行(在代碼註釋): -
toViewController.view.frame = transitionContext.finalFrame(for: toViewController)
...,但VC現在最終被收縮(1個移動至5)。我希望有人能看到我正在犯的可能的愚蠢錯誤。我試着簡單地將push部分複製到pop部分(並反轉所有內容),但它不起作用!
僅供參考......那些需要知道如何來裝過渡到一個UINavigationController - 在UINavigationControllerDelegate添加到您的導航控制器,具有以下功能一起...
func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationControllerOperation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { let transition: SwingTransition = SwingTransition.init(isPresenting: (operation == .push ? true : false)) return transition; }
下圖顯示了所有意見將共享相同的始發點(用於翻譯)。目標是給出一個左輪手槍桶將每個VC移動到視野中的錯覺。頂部中央視圖表示查看窗口,顯示堆棧中的第三個視圖。道歉對窮人的視覺效果......
代碼複習_and_問題解決,不錯的工作! – jrturton
這看起來像我期待的答案,它非常接近......不幸的是,過渡似乎來自不同的位置,破壞了視圖固定在旋轉光盤上的錯覺。我放慢了動畫速度,一些奇怪的原因,向左移動的視圖來自視圖右側的某個位置,而右側的視圖來自左側的某個位置。我試過在半寬處添加,但它們似乎沒有效果 – NickSaintJohn
想象一下,視圖是左輪手槍中的子彈,而槍管就是視窗。他們應該從相同的翻譯來源旋轉。我仍然試圖調整,但沒有得到任何地方 – NickSaintJohn