iPhone:自定义标签栏没有糟糕的更多菜单

时间:2011-12-19 13:55:05

标签: iphone uitabbarcontroller uitabbar

所以我想构建一个包含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吗?

4 个答案:

答案 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)

这非常接近,它可能对你有帮助

https://github.com/iosdeveloper/InfiniTabBar

答案 2 :(得分:1)

我应该最终确定这个帖子。我已经在App Store中使用了一年以上的东西,从长远来看它已经造成了大量的问题。它可以工作,但是当你依赖UITabbarcontroller的内置功能时它就会出现问题,因为它会混淆视图堆栈。

绕过这个热灰一年多后,我们决定建立自己的tabbarcontroller / menucontroller。花了一天时间,让我们摆脱了所有的修复和怪癖。 我的 hack 有效,但我建议您建立自己的导航类 - 从长远来看它会得到回报: - )

答案 3 :(得分:0)

我有类似的问题并通过使用UITabBarController并隐藏标签栏来解决它。然后我在它的顶部画了一个自定义标签栏,当点击一个标签的按钮时,调用

tabbar.selectedIndex = index 

'tabbar'是原始的UITabBarController。设置UITabBarController的selectedIndex属性会将当前显示的视图控制器更改为该索引处的控制器。这样你仍然可以获得UITabBarController的所有功能,但你可以拥有任意数量的标签,并根据需要自定义它。

否则,我认为没有办法删除“更多”功能。