내비게이션 컨트롤러를 구현하여 회전 디스크 유형의 레이아웃을 통합했습니다. 각 VC는 전체적으로 순환하는 원을 기준으로 순서대로 볼 수 있습니다. 제어기는 아래에 정의 전이 클래스를 사용하도록 구성된다 : -스위프트 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; } }
뷰 이동 방법의 표현은 후술하는 바와 같이 두 개의 적색 영역은 문제가있다 .. 다음 그림 쇼
.프리젠 테이션 (푸시) 번역은 잘 동작합니다. 1과 3으로 2 번 이동하여 2 번으로 이동합니다. 그러나 해체 (팝) 번역은 해제되지 않으므로 해산 된 VC가 외관상 올바르게 보이지 않게 이동합니다 (2 번은 3 번으로 이동). (이전) VC가 잘못된 위치 또는 틀린 크기의 프레임으로 도착합니다 ...
클래스가있는 상태에서 번역 결과 2는 3 (올바르게)으로 이동하지만 1은 4로 이동합니다 ,보기는 정확하게 크기가 조정되지만 계획된 위치에서 보이는 임의의 거리만큼 오프셋 된 것처럼 보입니다. 나는 그 이후로 다양한 솔루션을 시도했다. 내가 (코드에서 주석) 다음 줄을 추가하는 시도 팝업 섹션에서
: -
toViewController.view.frame = transitionContext.finalFrame(for: toViewController)
...하지만 VC 지금은 축소되고 끝 (5-1 이동). 나는 누군가 내가 바라는 바보 같은 실수를 볼 수 있기를 바란다. 간단히 말해서 팝 섹션 (그리고 모든 것을 뒤집는)에 푸시 섹션을 복제하려고 시도했지만 작동하지 않습니다! 참고로
...은 UINavigationController로의 전환을 연결 시설하는 방법을 알 필요 사람들은 -
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; }는
아래 그림에서는 모두 보여줍니다 ... 다음과 같은 기능과 함께, 귀하의 탐색 컨트롤러에 UINavigationControllerDelegate 추가 뷰는 번역을 위해 동일한 원점을 공유합니다. 목적은 리볼버 배럴이 각 VC를 움직이는 것처럼 보이게하는 것입니다. 상단 가운데보기는보기 창을 나타내며 스택의 세 번째보기를 나타냅니다. 가난한 영상에 대한 사과 ...
코드 검토 _and_ 문제 해결, 멋진 작업! – jrturton
이것은 내가 바라는 해답처럼 보입니다. 너무 가깝습니다 ... 슬프게도, 장면 전환은 회전하는 디스크에 고정되어 있다는 환상을 파괴하면서 다른 위치에서 시작된 것 같습니다. 애니메이션 속도가 느려졌습니다. 약간의 기괴한 이유, 왼쪽으로 이동하는보기는보기의 오른쪽에서 시작되며, 오른쪽의보기는 왼쪽으로 시작됩니다. 나는 반폭을 추가하려고 시도했지만 효과가없는 것 같습니다. – NickSaintJohn
리볼버에서보기가 총알이고 총구가보기 창이라고 상상해보십시오. 같은 번역 원점에서 회전해야합니다. 나는 여전히 조정하려고 시도하고 있지만 어디에도 가지 않고있다. – NickSaintJohn