Анимируйте содержимое UIViewController при навигации с помощью TabBar - PullRequest
0 голосов
/ 18 апреля 2020

Я пытаюсь воспроизвести анимацию, которая есть на Google Диске (iOS версия) при переходе с одной вкладки V C на другую (см. Ниже):

enter image description here

В настоящее время у меня есть доступ к fromView и toView при выборе элемента панели вкладок, поэтому я могу использовать UIView.animate () для анимации этих 2 представлений:

class MyCustomTabBarVC: UITabBarController {


    override func viewDidLoad() {
        super.viewDidLoad()
        delegate = self
    }
}



extension MyCustomTabBarVC: UITabBarControllerDelegate  {
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {

        guard let fromView = selectedViewController?.view, let toView = viewController.view else {
          return false
        }


        if fromView != toView {
            fromView.alpha = 1
            toView.alpha = 0.8

            UIView.animate(withDuration: 0.5, delay: 0.0, options: [.curveEaseInOut], animations: {
                fromView.alpha = 0

            }, completion: { (_) in
                UIView.animate(withDuration: 0.5, delay: 0.0, options: [.curveEaseInOut], animations: {
                    toView.alpha = 1
                })
            })

        }

        return true
    }
}

Проблема в том, что я не могу понять, какой тип анимации (или цепочки анимаций) используется / используется в случае с Google Drive.

Анимация, которую я использую в приведенном выше коде не будет иметь тот же результат. Может ли кто-нибудь с лучшим пониманием анимации помочь? :)

1 Ответ

1 голос
/ 18 апреля 2020

Ну, я бы сказал, что во-первых, они используют более быструю анимацию (более короткую продолжительность), и они происходят одновременно. Кроме того, они анимируют альфа и масштаб данных представлений.

Я бы использовал что-то вроде этого:

...
    // prepare view
    toView.transform = CGAffineTransform(scaleX: 0.7, y: 0.7)
    toView.alpha = 0

    // Animate
    UIView.animate(withDuration: 0.3, delay: 0.0, options: [.curveEaseInOut], 
    animations: {
       fromView.alpha = 0
       fromView.transform = CGAffineTransform(scaleX: 0.7, y: 0.7)

       toView.transform = .identity
       toView.alpha = 1

    }, completion: nil)

Это лучше?

РЕДАКТИРОВАТЬ:

Поскольку мы обсуждали другое решение в комментариях - чтобы получить более эффективные способы для анимации подпредставлений, вы можете напечатать приведение этих viewControllers. Не забывайте, что если вы встроили, например, UINavigationControllers, вы должны сначала набрать приведение к этому классу! Я попробовал это, и это работает:

extension MyCustomTabBarVC: UITabBarControllerDelegate  {

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {

    // Presented View Controller which should fade out
    if let selectedNC = selectedViewController as? UINavigationController {
        if let myFirstVC = selectedNC.viewControllers.first as? MyFirstViewController {
            // animate fade out
        } else if let mySecondVC = selectedNC.viewControllers.first as? MySecondViewController {
            // animate fade out
        }
    }

    // View Controllers which should be selected
    if let navigationController = viewController as? UINavigationController {

        if let firstC = navigationController.viewControllers.first as? MyFirstViewController {
           // animate fade in
        } else if let firstC = navigationController.viewControllers.first as? MySecondViewController {
            // animate fade in
        }
    }

    return true
}

}

Без контроллера навигации вы можете просто напечатать приведение таких как:

...
    if let myFirstVC = selectedViewController as? MyFirstViewController {
      // animate fade out
    }
 ...
...