我尝试自己制作 TabBarControllers View 的左/右滑动动画。当您滑动时,新的传入 View 会向上移动 iOS 状态栏的高度。因此,它直接连接到屏幕顶部并与状态栏重叠。动画完成后, View 会跳到正确的位置。 这只发生在第一次加载 View / View 尚未加载时。如果失败,则在动画开始之前 isViewLoaded 为 false。
UIView.transition(from: selectedViewController!.view, to: getTabView(index),
duration: 0.3, options: UIView.AnimationOptions.transitionCrossDissolve,
completion: { _ in selectedIndex = index })
...
func getTabView(_ index:Int) -> UIView {
if self.viewControllers![index].isViewLoaded {
//print "loaded" - all fine - view's position is correct
//tried loadView() but doesnt change anything
}
else {
//print "first load" - view is shifted up
}
return viewControllers![index].view //when accessing .view, the view is loaded anyway (docs)
}
顺便说一句,当我通过 tabBar 按钮切换选项卡时,不会出现该问题。
非常感谢!
最佳答案
虽然还是很奇怪,但我已经解决了。 首先,我设置了一个 UITabBarControllerDelegate,以便在触摸选项卡栏按钮时在选项卡之间进行 CrossDissolve。 因为这可以正常工作,所以我想我可以以某种方式调用委托(delegate)函数
tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool
以编程方式代替
UIView.transition(from: selectedViewController!.view, to: getTabView(index),
duration: 0.3, options: UIView.AnimationOptions.transitionCrossDissolve,
completion: { _ in selectedIndex = index })
这不起作用,还有另一个故障。但之前它在某种程度上是显而易见的,因为我读到它并不打算直接调用这个委托(delegate)函数。 通过尝试这个和那个,它突然起作用了。我不小心取消了以下两项注释:委托(delegate)函数调用和 UIView.transition 之后。这有效。
关于iOS 动画 UITabBarController 滑动; View 重叠状态栏 - 仅在第一次加载时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58989844/