我有一个带有标签栏和导航栏的应用。
我有BaseVC
和DetailVC
。我从DetailVC
推了BaseVC
。我希望tabbar位于推送的VC DetailVC
下。我使用hidesBottomBarWhenPushed
来实现它。它工作得很好,但由于某种原因,当它动画推动时,标签栏仍然可见,并且当动画结束时,标签栏被隐藏。我希望它也可以在动画中推送的VC下。
我的代码是:
self.hidesBottomBarWhenPushed = true
self.navigationController?.pushViewController(detailVC, animated: true)
self.hidesBottomBarWhenPushed = false
结果(错误)是这样的:
任何人都知道为什么tabbar"跳跃"?谢谢!
答案 0 :(得分:3)
看过有问题的项目后,我找到了一种方法让它发挥作用:
viewWillLayoutSubviews
中移除TabBarViewController
,以便它不再确定标签栏的高度,从而不会停止动画正常工作。创建一个名为MyTabBar的新swift文件(或任何你想要的)并将其放入其中:
import UIKit
class MyTabBar: UITabBar {
var tabBarHeight: CGFloat = 100
override func sizeThatFits(_ size: CGSize) -> CGSize {
let superSize = super.sizeThatFits(size)
return CGSize(width: superSize.width, height: self.tabBarHeight)
}
}
创建一个名为TabBarStoryboard(或其他)的故事板。除了以后创建的UITabBarController之外,它不会被用于其他任何东西。
在故事板中,将UITabBarController的类类型设置为TabBarViewController
类,以便在实例化时获取正确的类。
在故事板中,将属于UITabBarController的UITabBar的类类型设置为MyTabBar,以便在实例化时它也是正确的类。
在RootViewController中替换为:
fileprivate let tabBarViewController = TabBarViewController()
用这个:
fileprivate lazy var tabBarViewController: TabBarViewController = {
let storyboard = UIStoryboard(name: "TabBarStoryboard", bundle: nil)
return storyboard.instantiateViewController(withIdentifier: "MyTabBarController") as! TabBarViewController
}()
在TabBarViewController中,将其添加到viewDidLoad
的末尾以设置标签栏的高度:
if let tabBar = self.tabBar as? MyTabBar {
tabBar.tabBarHeight = self.tabBarHeight
}
现在,如果你得到了所有正确的答案,你应该有一个所需大小的标签栏,动画应该正常工作,因为标签栏的高度不再受viewDidLayoutSubviews方法控制。
我不得不使用故事板来保存基本的UITabBarController,因为我无法找到设置其UITabBar属性的方法(如果有人知道添加注释的方式。
如果难以理解,我已将我的项目版本上传到dropbox,这是链接:PlayWiz-NewVersion.zip。请小心,因为它将解压缩到相同的目录结构,因此将其解压缩到与原始文件夹不同的文件夹,否则您将丢失原始文件。
该方法对我来说似乎正常工作,我认为没有理由存在任何问题,但首先要彻底测试。
答案 1 :(得分:1)
我对上述示例进行了更简单的修改(顺便说一句) 我将所有内容粘贴到viewDidLoad中,但是您可以将其编写得更漂亮。
class TabBarController: UITabBarController {
override func viewDidLoad() {
// create the normal buttons (controllers)
let viewControllers = [UINavigationController(rootViewController: firstButton), UINavigationController(rootViewController: secontButton)]
self.viewControllers = viewControllers
// create the middle rounded button
self.tabBar.addSubview(addItemButton)
// setup constraints
addItemButton.widthAnchor.constraint(equalToConstant: 64).isActive = true
addItemButton.heightAnchor.constraint(equalToConstant: 64).isActive = true
tabBar.centerXAnchor.constraint(equalTo: self.addItemButton.centerXAnchor).isActive = true
tabBar.topAnchor.constraint(equalTo: self.addItemButton.centerYAnchor, constant: -8).isActive = true
}
extension UITabBar {
// fix clicking the (+) external to the tabbar bounds
override open func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if (!self.clipsToBounds && !self.isHidden && self.alpha > 0.0) {
let subviews = self.subviews.reversed()
for member in subviews {
let subPoint = member.convert(point, from: self)
if let result:UIView = member.hitTest(subPoint, with:event) {
return result;
}
}
}
return super.hitTest(point, with: event)
}
// this fixes the "jumping" tabBar when using the "hidesBottomBarWhenPushed = true"
override open func sizeThatFits(_ size: CGSize) -> CGSize {
let superSize = super.sizeThatFits(size)
return CGSize(width: superSize.width, height: 85)
}
}
现在,只需调用hidesBottomBarWhenPushed = true并推送所需的视图控制器即可。