目前我有一个标准的标签栏,当点击时会转到相应的viewController。但是当我选择更多标签时,我想从标签栏中弹出一个菜单,如下图所示。
有任何建议可以实现吗? 提前谢谢。
答案 0 :(得分:4)
我建议你这样做:
首先,您应该考虑标签栏中可能包含的所有标签类型。在屏幕截图中,有显示控制器的选项卡和显示菜单的选项卡。所以我们可以用所有这些类型创建枚举:
enum TabType {
case controller
case menu
}
之后,您可以存储选项卡类型数组,以便它们显示在标签栏中,为您的屏幕截图如此
let tabTypes: [TabType] = [.controller, .controller, .controller, .controller, .menu]
然后你应该实现UITabBarControllerDelegate
的{{1}}方法,如果允许标签栏选择传递的控制器,则返回func tabBarController(_:, shouldSelect:) -> Bool
,否则返回true
。
如果您返回false
而不是所有其他工作(如呈现视图控制器和其他内容),标签栏控制器将为您完成。
在您的情况下,您希望在标签点击上执行自定义操作,因此您应该返回true
。返回之前,您应该出示您的菜单。
false
在此实现中,您可以轻松更改选项卡类型顺序或添加其他选项卡类型并对其进行适当处理。
答案 1 :(得分:0)
它不是很好的用户界面,但如果你想要的话。
首先你必须实现UITabbarControllerDelegate的委托方法,如下所示
func tabBarController(_ tabBarController: UITabBarController, shouldSelect
viewController: UIViewController) -> Bool {
if viewController.classForCoder == moreViewController.self
{
let popvc = MoreSubMenuViews(nibName: "MoreSubMenuViews", bundle: Bundle.main)
self.addChildViewController(popvc)
let tabbarHeight = tabBar.frame.height
let estimatedWidth:CGFloat = 200.0
let estimatedHeight:CGFloat = 300.0
popvc.view.frame = CGRect(x:self.view.frame.width - estimatedWidth, y: self.view.frame.height - estimatedHeight - tabbarHeight, width: estimatedWidth, height: estimatedHeight)
self.view.addSubview(popvc.view)
popvc.didMove(toParentViewController: self)
print("sorry stop here")
return true // if you want not to select return false here
}else{
//remove popup logic here if opened
return true
}
}
此处 moreViewController 是最后一个标签控制器& MoreSubMenuViews 是nib / xib文件,其中包含图片中显示的按钮。
答案 2 :(得分:0)
您可以使用可滚动的标签视图来获得更好的UI,而不是显示菜单。如果您更喜欢使用库,here's可以实现一个简单的可滚动标签栏。
答案 3 :(得分:0)
这是滥用Apples HIG中的UI模式布局。具体做法是:
严格使用标签栏进行导航。标签栏按钮不应用于执行操作。如果需要提供作用于当前视图中元素的控件,请改用工具栏。
此控件应用于展平您的应用层次结构。在这种情况下,您似乎正在混合按钮的功能。有时它会选择一个单独的视图控制器,有时它会显示一个动作列表。这对用户来说是一个令人困惑的情况,应该避免。
您可以通过使用导航或工具栏来实现此目标并仍然坚持HIG。在工具栏按钮中嵌入此控件。最简单的情况是调用UIActionController
选择.actionSheet
样式。
答案 4 :(得分:0)
<强> 1)强> 创建一个&#34; Tab5ViewController&#34;并使用此:
static func takeScreenshot(bottomPadding padding: CGFloat = 0) -> UIImage? {
let layer = UIApplication.shared.keyWindow!.layer
let scale = UIScreen.main.scale
UIGraphicsBeginImageContextWithOptions(CGSize(width: layer.frame.size.width, height: layer.frame.size.height - padding), false, scale)
guard let context = UIGraphicsGetCurrentContext() else { return nil }
layer.render(in: context)
let screenshot = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return screenshot
}
将屏幕截图用作&#34; Tab5ViewController&#34;
的背景图片2)在你的&#34; Tab5ViewController&#34;您可以拥有堆栈组件(其他选项卡),然后根据选择添加/删除子视图控制器
第3)强> 修复边缘情况(如选项卡选择突出显示等等)