所以我想构建一个包含5个以上项目的tabbar,并且可以滚动并找到this article。 通过继承UITabBarController并隐藏现有的tabbar轻松完成:
for(UIView *view in self.view.subviews)
{
if([view isKindOfClass:[UITabBar class]])
{
view.hidden = YES;
break;
}
}
然后我只是添加一个UIScrollView并根据tabbarcontroller的items-collection抛出一些按钮。
int i = 0;
for (UITabBarItem *item in self.tabBar.items)
{
UIView *tab = [[[UIView alloc] initWithFrame:CGRectMake(i*60, 0, 60, 60)] autorelease];
UIButton *btn = [[[UIButton alloc] initWithFrame:CGRectMake(7.5, 1, 45, 45)] autorelease];
[btn setImage:item.image forState:UIControlStateNormal];
btn.tag = i;
[btn addTarget:self action:@selector(didSelectTabrBarItem:) forControlEvents:UIControlEventTouchUpInside];
[tab addSubview:btn];
[self.scrollView addSubview:tab];
i++;
if(self.selectedViewController == nil)
[self setSelectedIndex:0];
}
我正在覆盖setSelectedindex / ViewController,因为我需要一些额外的绘图。
-(void)setSelectedViewController:(UIViewController *)selectedViewController
{
[super setSelectedViewController:selectedViewController];
[self startTimer];
}
-(void)setSelectedIndex:(NSUInteger)selectedIndex
{
[super setSelectedIndex:selectedIndex];
[self startTimer];
}
问题是当我按下按钮编号5,6或7时,tabbarcontroller会打开更多视图。我如何摆脱这一点,使最后三个项目像其他项目一样? - 可能是超级电话吗?
我的猜测是完全杀死UITabBarController并实现我自己的自定义tabbar。但是可以禁用更多菜单并让UITabBarController正常选择项目5,6和7吗?
答案 0 :(得分:6)
所以,既然我很难写一个全新的标签栏,我决定调查并试图破解UITabBarController。
以下是解决方案:
实际问题是,当您触摸索引大于4的标签栏项时,UITabBarController vil实际上会显示moreNavigationController。这是一个UINavigationController,包含UIMoreViewControllerList类型的视图,它是私有Cocoa框架中的一个类型,以及您选择的ViewController的实例。
那么我们如何摆脱更多按钮?
只需从moreNavigationController集合中删除UIMoreViewControllerList,只保留您选择的ViewController。
-(void)setSelectedViewController:(UIViewController *)selectedViewController
{
[super setSelectedViewController:selectedViewController];
if([self.moreNavigationController.viewControllers count] > 1)
{
//Modify the view stack to remove the More view
self.moreNavigationController.viewControllers = [[[NSArray alloc] initWithObjects:self.moreNavigationController.visibleViewController, nil] autorelease];
}
}
好吧,我们在右上角留下了一个编辑按钮(标题栏)。
你怎么摆脱那个呢?
呀。那是另一个肮脏的黑客。要删除Edit按钮,我实际上必须从UINavigationControllerDelegate为我的自定义UITabBarController上的moreNavigationController实现一个方法。
//navigationController delegate
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if ([navigationController isKindOfClass:NSClassFromString(@"UIMoreNavigationController")])
{
// We don't need Edit button in More screen.
UINavigationBar *morenavbar = navigationController.navigationBar;
UINavigationItem *morenavitem = morenavbar.topItem;
morenavitem.rightBarButtonItem = nil;
}
}
这就是杀掉默认更多功能的方法。我真的觉得Apple在这里生了一条裤子,创造了一个UITabBarController,它既可以处理逻辑也可以处理UI。 为什么不创建一个具有预加载ViewControllers并在之间切换的逻辑的控制器,然后如果你想要更多东西就可以使用的实现。 - 甚至更好:可以禁用更多功能。
答案 1 :(得分:1)
这非常接近,它可能对你有帮助
答案 2 :(得分:1)
我应该最终确定这个帖子。我已经在App Store中使用了一年以上的东西,从长远来看它已经造成了大量的问题。它可以工作,但是当你依赖UITabbarcontroller的内置功能时它就会出现问题,因为它会混淆视图堆栈。
绕过这个热灰一年多后,我们决定建立自己的tabbarcontroller / menucontroller。花了一天时间,让我们摆脱了所有的修复和怪癖。 我的 hack 有效,但我建议您建立自己的导航类 - 从长远来看它会得到回报: - )
答案 3 :(得分:0)
我有类似的问题并通过使用UITabBarController并隐藏标签栏来解决它。然后我在它的顶部画了一个自定义标签栏,当点击一个标签的按钮时,调用
tabbar.selectedIndex = index
'tabbar'是原始的UITabBarController。设置UITabBarController的selectedIndex属性会将当前显示的视图控制器更改为该索引处的控制器。这样你仍然可以获得UITabBarController的所有功能,但你可以拥有任意数量的标签,并根据需要自定义它。
否则,我认为没有办法删除“更多”功能。