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



为什么当我尝试通过 selectedIndex 属性更改视图时动画无法正常工作(黑屏(,但如果我在点击 tabBar 项目时更改它们,它就可以工作?

(我是斯威夫特的初学者。对不起,懒洋洋的帖子,我想尽可能清楚(

上下文

我想要实现的目标:

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


到目前为止有效的方法:

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

每次按下选项卡栏项目时,动画都能正常工作。它在源视图上方显示目的地视图,就像在进行显示 segue 一样。

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 更改视图,屏幕会变黑(源视图消失(,然后显示动画目的地视图。

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. Tap tabBarItem[1] (secondViewController(
  3. 通过点击选项卡返回第一视图控制器 栏项[0]
  4. 点击 alphaButton(它将再次将我发送到 secondViewController 并显示过渡,显示上一个视图上方的视图,在本例中为 FirstViewController(

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

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

为什么它显示黑屏?我怎样才能避免这种情况?

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

谢谢:)

解决了。

使用这个(在 alphaButton 中(:

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

取而代之的是:

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

相关内容

  • 没有找到相关文章

最新更新