Я начал смотреть на анимации перехода View Controller. У меня есть два контроллера просмотра basi c. В контроллере начального представления у меня есть изображение в заданной позиции на экране. Когда я нажимаю кнопку, я ожидаю, что изображение во втором контроллере представления переместится из положения изображения, найденного в контроллере начального представления, в центр экрана.
Это начальный контроллер представления:
Это второй контроллер представления, показывающий, что анимация по какой-то причине начинается в верхнем левом углу, а затем анимируется в центре экрана.
.
Вот код, который я использую:
extension ViewController: UIViewControllerTransitioningDelegate {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
transition.fromCenter = self.profileImage.center
guard let viewControllerTwo = presented as? ViewControllerTwo else { return nil }
transition.toCenter = viewControllerTwo.profileImage.center
return transition
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return transition
}
}
Мой код анимации:
class MyAnimation:NSObject, UIViewControllerAnimatedTransitioning {
let duration = 10.0
var fromCenter = CGPoint.zero
var toCenter = CGPoint.zero
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return duration
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let containerView = transitionContext.containerView
guard let toViewController = transitionContext.viewController(forKey: .to) as? ViewControllerTwo else { return }
toViewController.profileImage.center = fromCenter
toViewController.profileImage.transform = CGAffineTransform(scaleX: 0.3, y: 0.3)
containerView.addSubview(toViewController.view)
containerView.bringSubviewToFront(toViewController.view)
UIView.animate(withDuration: duration, delay: 0.0, options: .curveEaseInOut, animations: {
toViewController.profileImage.center = self.toCenter
toViewController.profileImage.transform = .identity
}, completion: { _ in
transitionContext.completeTransition(true)
})
}
}
Исходный код ViewController:
class ViewController: UIViewController {
let transition = MyAnimation()
@IBOutlet weak var profileImage: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
let image = UIImage(named:"teamwork")
profileImage.image = image
}
@IBAction func buttonPressed(_ sender: Any) {
guard let storyboard = self.storyboard else { return }
guard let viewController2 = storyboard.instantiateViewController(withIdentifier: "ViewControllerTwo") as? ViewControllerTwo else {
return
}
viewController2.profileImageData = profileImage.image
viewController2.modalPresentationStyle = .overFullScreen
viewController2.transitioningDelegate = self
self.present(viewController2, animated: true, completion: nil)
}
}
Второй код контроллера представления:
class ViewControllerTwo: UIViewController {
@IBOutlet weak var profileImage: UIImageView!
var profileImageData:UIImage?
override func viewDidLoad() {
super.viewDidLoad()
self.profileImage.image = profileImageData
}
Я думаю, что если я установлю центр imageView во втором контроллере представления, он должен начать анимацию с этой позиции, т.е.
toViewController.profileImage.center = fromCenter
Должен остановить запуск анимации в верхнем левом углу второго контроллера представления. Ясно, что это не так, и я явно делаю что-то не так. Я просто не уверен на 100% где. Помощь будет оценена.