У меня есть tabBarController, подключенный к 3 ViewController, и каждый ViewController встроен в NavigationController.Я настроил его так, что один из пользовательских ViewController будет скользить вверх перед текущим ViewController при нажатии на вкладке.Это работает нормально.
Тем не менее, пользовательский ViewController имеет кнопку «отмена», которая должна заставить его скользить вниз и открывать старый ViewController.Как бы я ни пытался это сделать, анимация не будет скользить в том направлении, в котором мне это нужно.По какой-то причине ViewController запускается с экрана, а затем пытается скользить по экрану.Как только он скользит, он исчезает и отображается старый контроллер вида.
Я хочу, чтобы он запускался на экране и скользил вниз.
Код анимации в TabBarController:
func animateToTab(toIndex: Int) -> Bool {
guard let tabViewControllers = viewControllers,
let selectedVC = selectedViewController else { return false}
guard let fromView = selectedVC.view,
let toView = tabViewControllers[toIndex].view,
let fromIndex = tabViewControllers.index(of: selectedVC),
fromIndex != toIndex else { return false}
// Add the toView to the tab bar view
fromView.superview?.addSubview(toView)
// Position toView off screen (above subview)
let screenHeight = UIScreen.main.bounds.size.height
let offset = -screenHeight
toView.center = CGPoint(x: fromView.center.x, y: toView.center.y - offset)
// Disable interaction during animation
view.isUserInteractionEnabled = false
UIView.animate(withDuration: 0.3,
delay: 0.1,
options: .curveEaseOut,
animations: {
// Slide the views by -offset
toView.center = CGPoint(x: toView.center.x, y: toView.center.y + offset)
}, completion: { finished in
// Remove the old view from the tabbar view.
fromView.removeFromSuperview()
self.selectedIndex = toIndex
self.view.isUserInteractionEnabled = true
})
return true
}
Код анимации в ViewController, вызываемый функцией IBAction.
func animateToTab(toIndex: Int){
let tabBar = self.tabBarController!
guard let tabViewControllers = tabBar.viewControllers,
let selectedVC = tabBar.selectedViewController else { return }
guard let fromView = selectedVC.view,
let toView = tabViewControllers[toIndex].view,
let fromIndex = tabViewControllers.index(of: selectedVC),
fromIndex != toIndex else { return }
// Add the toView to the tab bar view
toView.superview?.addSubview(fromView)
// Position fromView on screen
let screenHeight = UIScreen.main.bounds.size.height
let offset = -screenHeight
fromView.center = CGPoint(x: toView.center.x, y: fromView.center.y)
// Disable interaction during animation
tabBar.view.isUserInteractionEnabled = false
UIView.animate(withDuration: 0.3,
delay: 0.1,
options: .curveEaseOut,
animations: {
// Slide the views by -offset
fromView.center = CGPoint(x: toView.center.x, y: fromView.center.y + offset)
}, completion: { finished in
// Remove the old view from the tabbar view.
fromView.removeFromSuperview()
tabBar.selectedIndex = toIndex
tabBar.view.isUserInteractionEnabled = true
})
}