如果通过selectedIndex属性进行了更改,则更改视图时的动画将无法正常工作

时间:2018-08-12 18:24:54

标签: swift animation uiviewcontroller uitabbarcontroller

为什么当我尝试通过selectedIndex属性更改视图时动画不能正常工作(黑屏),但是如果在点击tabBar项时更改视图,动画可以工作吗?

(我是一位速成新手。很抱歉,最近发布的帖子很抱歉,我想尽可能清楚一点)

上下文

我要实现的目标:

我希望与tabBar项目[0],[1],[n ...]相关联的视图具有动画以供演示,无论它们是在按tabBar项目时还是被更改时还是通过编程方式更改了selectedItem属性。


到目前为止有效的方法:

我为tabBar创建了一个自定义类,并覆盖了放置动画的' shouldSelect viewController:UIViewController '方法。

每次按下tabBar项时,动画效果都很好。它在sourceView上方显示了destinationView,就像在进行表演时显示的一样。

extension MySubclassedTabBarController: UITabBarControllerDelegate  {

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

        if let sourceView = selectedViewController?.view, let destinationView = viewController.view, sourceView != destinationView {
            sourceView.superview?.insertSubview(destinationView, aboveSubview: sourceView)
            destinationView.transform = CGAffineTransform(translationX: sourceView.frame.size.width, y: 0)
            UIView.animate(withDuration: 0.25,
                           delay: 0.0,
                           options: .curveEaseInOut,
                           animations: { destinationView.transform = CGAffineTransform(translationX: 0, y: 0) },
                           completion: nil)
        }
        return true
    }
}

未正常解决的问题:

除了在按下tabBar项时更改视图之外,我还想通过在UIButton操作中以编程方式设置selectedIndex属性来更改与tabBar关联的视图。

如果我是第一次加载该应用程序,并尝试通过alphaButton更改视图,则屏幕会变黑(sourceView消失),然后显示动画的destinationView。

class FirstViewController () {

    @IBAction func alphaButton(_ sender: Any) {

        tabBarController?.selectedIndex = 1

        if let sourceView = view, let destinationView = tabBarController?.selectedViewController?.view, sourceView != destinationView {
            sourceView.superview?.insertSubview(destinationView, aboveSubview: sourceView)
            destinationView.transform = CGAffineTransform(translationX: sourceView.frame.size.width, y: 0)
            UIView.animate(withDuration: 0.25,
                           delay: 0.0,
                           options: .curveEaseInOut,
                           animations: { destinationView.transform = CGAffineTransform(translationX: 0, y: 0) },
                           completion: nil)
        }
    }
}

如果之前未显示目标视图,则过渡将无法正常进行。

换句话说,它在以下情况下可以正常工作

  1. 运行应用
  2. 点击tabBarItem [1](secondViewController)
  3. 点击tabBarItem [0]返回到firstViewController
  4. 点击alphaButton(它将再次将我发送到secondViewController并显示将视图显示在上一个视图上方的过渡,在此情况下,该视图为FirstViewController)

如果出现以下情况,它将无法正常工作

  1. 运行应用
  2. 点击alphaButton(它显示过渡效果,并显示显示动画的视图,但屏幕先变黑)

为什么显示黑屏?如何避免这种情况?

欢迎以其他方式实现我想要的建议

谢谢:)

1 个答案:

答案 0 :(得分:-1)

已解决。

使用此命令(在alphaButton中):

destinationView.superview?.insertSubview(sourceView, belowSubview: destinationView)

代替此:

sourceView.superview?.insertSubview(destinationView, aboveSubview: sourceView)