Просмотр переходов, когда TabBatController.selectedIndex изменился программно - PullRequest
0 голосов
/ 23 февраля 2019

У меня возникли проблемы с анимацией переходов между представлениями при изменении программного параметра UITabBarController.selectedIndex.

Когда я нажимаю на значок TabBar, анимация работает нормально, но когда я заменяю selectedIndex на действие gestureRecognizer.

Код перехода в классе контроллера TabBar:следующее:

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    if CanChangeTab {
        guard let fromView = tabBarController.selectedViewController!.view, let toView = viewController.view else {
            return false // Make sure you want this as false
        }

        if fromView != toView {
            if (tabBarController.prevIndex > tabBarController.selectedIndex) {
                UIView.transition(from: fromView, to: toView, duration: 0.3, options: [.transitionFlipFromLeft], completion: nil)
            } else {
                UIView.transition(from: fromView, to: toView, duration: 0.3, options: [.transitionFlipFromRight], completion: nil)
            }
        }
        return true
    } else {
        return false
    }
}

Распознаватель жестов вызывает следующую функцию, из которой вышеуказанный код не вызывается:

@objc func swiped(_ gesture: UISwipeGestureRecognizer) {
    if (CanChangeTab) {
        self.tabBarController?.prevIndex = (self.tabBarController?.selectedIndex)!
        if gesture.direction == .left {
            if (self.tabBarController?.selectedIndex)! < 4 { // set your total tabs here
                self.tabBarController?.selectedIndex += 1
            }
        } else if gesture.direction == .right {
            if (self.tabBarController?.selectedIndex)! > 0 {
                self.tabBarController?.selectedIndex -= 1
            }
        }
    }
}

Я не вижу, что нужно вызвать или переопределить, чтобы получитьанимации для базы жестов тоже меняются.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Хорошо.Я нашел решение, используя анимацию слайдов ViewController

, как предложил Мэтт.

Таким образом, используя расширение + функцию animateToTab в расширении и меняя мой метод смахивания, он работает так, как ожидалось.

   @objc func swiped(_ gesture: UISwipeGestureRecognizer) {
    if (CanChangeTab) {
        let thisTabController = self.tabBarController as! iBayTabController

        thisTabController.prevIndex = (thisTabController.selectedIndex)
        if gesture.direction == .left {
            if thisTabController.selectedIndex < 4 { // set your total tabs here
                thisTabController.animateToTab(toIndex: thisTabController.selectedIndex+1)
            }
        } else if gesture.direction == .right {
            if (self.tabBarController?.selectedIndex)! > 0 {
                thisTabController.animateToTab(toIndex: thisTabController.selectedIndex-1)
            }
        }
    }
}
0 голосов
/ 23 февраля 2019

Проблема в том, что вы не делаете анимацию контроллера панели вкладок.Вы должны написать формально структурированный пользовательский анимационный переход.

Это означает, что:

  • Ваш контроллер панели вкладок имеет делегата, реализующего animationControllerForTransitionFromдля возврата объекта UIViewControllerAnimatedTransitioning и interactionControllerFor для возврата объекта UIViewControllerInteractiveTransitioning.

  • Эти объекты реализуют startInteractiveTransition, interruptibleAnimator(using:), transitionDuration(using:), animateTransition(using:) и animationEnded для выполнения анимации через UIViewPropertyAnimator.

Затем распознаватель жестов сможет запускать анимацию, установив selectedIndex, и сможет отслеживать и обновлять анимацию с помощьюпредоставленный объект UIViewControllerContextTransitioning и UIViewPropertyAnimator.

...