Перевернуть карту перехода в iOS
Я следовал следующему руководству по реализации анимации перелистывания карт: https://www.raywenderlich.com/110536/custom-uiviewcontroller-transitions
А вот код моего аниматора (идентичный приведенному в руководстве):
import UIKit
class FlipCardAnimator: NSObject, UIViewControllerAnimatedTransitioning {
var originFrame = CGRect.zero
var cardView = UIView()
func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
return 0.6
}
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
guard let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey),
let containerView = transitionContext.containerView(),
let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) else {
return
}
let initialFrame = originFrame
let finalFrame = transitionContext.finalFrameForViewController(toVC)
let snapshot = toVC.view.snapshotViewAfterScreenUpdates(true)
snapshot.frame = initialFrame
snapshot.layer.cornerRadius = 25
snapshot.layer.masksToBounds = true
containerView.addSubview(toVC.view)
containerView.addSubview(snapshot)
toVC.view.hidden = true
perspectiveTransformForContainerView(containerView)
snapshot.layer.transform = yRotation(M_PI_2)
let duration = transitionDuration(transitionContext)
UIView.animateKeyframesWithDuration(
duration,
delay: 0,
options: .CalculationModeCubic,
animations: {
UIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 1/3, animations: {
fromVC.view.layer.transform = self.yRotation(-M_PI_2)
})
UIView.addKeyframeWithRelativeStartTime(1/3, relativeDuration: 1/3, animations: {
snapshot.layer.transform = self.yRotation(0.0)
})
UIView.addKeyframeWithRelativeStartTime(2/3, relativeDuration: 1/3, animations: {
snapshot.frame = finalFrame
})
},
completion: { _ in
toVC.view.hidden = false
snapshot.removeFromSuperview()
transitionContext.completeTransition(!transitionContext.transitionWasCancelled())
})
}
func yRotation(angle: Double) -> CATransform3D {
return CATransform3DMakeRotation(CGFloat(angle), 0.0, 1.0, 0.0)
}
func perspectiveTransformForContainerView(containerView: UIView) {
var transform = CATransform3DIdentity
transform.m34 = -0.002
containerView.layer.sublayerTransform = transform
}
}
Проблема: я вижу только то, как вид переворачивается, а потом ничего! экран исчезает, и я вообще не вижу вид контроллера-получателя. Хотя я вижу, что это функция viewDidLoad вызывается (добавлена отладка печати). По какой-то причине работает только первая 1/3 анимации, а потом я ничего не вижу.