(我是一位速成新手。很抱歉,最近发布的帖子很抱歉,我想尽可能清楚一点)
上下文
我要实现的目标:
我希望与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)
}
}
}
如果之前未显示目标视图,则过渡将无法正常进行。
换句话说,它在以下情况下可以正常工作
:如果出现以下情况,它将无法正常工作
:为什么显示黑屏?如何避免这种情况?
欢迎以其他方式实现我想要的建议
谢谢:)
答案 0 :(得分:-1)
已解决。
使用此命令(在alphaButton中):
destinationView.superview?.insertSubview(sourceView, belowSubview: destinationView)
代替此:
sourceView.superview?.insertSubview(destinationView, aboveSubview: sourceView)