为什么当我尝试通过 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)
}
}
}
如果之前未显示目标视图,则转换将无法正常工作。
换句话说,在以下情况下,它可以正常工作:
- 运行应用
- Tap tabBarItem[1] (secondViewController(
- 通过点击选项卡返回第一视图控制器 栏项[0]
- 点击 alphaButton(它将再次将我发送到 secondViewController 并显示过渡,显示上一个视图上方的视图,在本例中为 FirstViewController(
如果出现以下情况,它将无法正常工作:
- 运行应用
- 点击 alphaButton(它显示过渡并显示显示动画的视图,但屏幕首先变黑(
为什么它显示黑屏?我怎样才能避免这种情况?
欢迎以其他方式实现我想要的建议
谢谢:)
解决了。
使用这个(在 alphaButton 中(:
destinationView.superview?.insertSubview(sourceView, belowSubview: destinationView)
取而代之的是:
sourceView.superview?.insertSubview(destinationView, aboveSubview: sourceView)