自定义tabBar(仿百思不得姐的tabBar设计)

来源:互联网 发布:网络用语沙发的意思 编辑:程序博客网 时间:2024/05/17 02:43

在制作App的时候我们可能会遇到“不标准的”tabBar。何谓不标准,就是在普通的带有图片和文字的tabBarItem中混进了一个只带有图片的Item,而且图片很大,这样按照常规方法是无法实现的,例如百思不得姐。


上图就有百思不得姐的tabBar,一眼看过去就是4个tabBarItem加上1个button,但是如果我们这样写的话就会产生一个问题,4个tabBarItem均分了整个tabBar的宽度,button插在中间,而且button无法被点击。


但是我们又不能去设置5个tabBarItem去设置,因为这样的话中间的加号按钮就无法占满,会和别的图片一样大小,又没有文字,这样就很不美观,那么怎么办呢?这就要用到自定义,其实iOS的控件我们看起来很多方法都是直接去调用,UI直接去设置,但是有没有想过我们去自定义呢?


方法1:在底部设置View,然后通过button按照样式放好,再通过self.selectedIndex去跳转标签页,这样实现起来没有问题,但是相对起来显得麻烦,因为图片和文字需要调整位置,这个会很蛋疼。所以我推荐方法2。


方法2:重写tabBar,我们自己新建一个tabBar的类,我们其实可以发现,tabBar上面的按钮肯定都是继承与UIView和UIControl类,那么我们可以在layoutSubviews方法中重新设置每个Item的位置,并在中间插入一个button。(一定要在layoutSubviews中实现,如果在init中实现,则系统默认生成的样式会覆盖掉我们自定义的)。

- (void)layoutSubviews{    [super layoutSubviews];        //设置发布按钮的frame    self.publishButton.center = CGPointMake(self.width*0.5, self.height*0.5);        //设置其他UITabBarButton的frame    CGFloat buttonY = 0;    CGFloat buttonW = self.width/5.0;    CGFloat buttonH = self.height;    NSInteger index = 0;    for (UIView * button in self.subviews)    {//        if (![button isKindOfClass:NSClassFromString(@"UITabBarButton")]) continue;        if (![button isKindOfClass:[UIControl class]] || button == self.publishButton) continue;                //计算按钮的X值        CGFloat buttonX = buttonW * ((index > 1) ? (index + 1) : index);        button.frame = CGRectMake(buttonX, buttonY, buttonW, buttonH);                //增加索引        index++;    }}
如此一来我们就可以改变系统设计好的tabBarItem的位置,并在中间插入红色的加号。那么如何去将我们自定义好的这个tabBar放在tabBarController里面呢,一般我们会这么做。
self.tabBar = [[XXXTabBar alloc] init];
但是会发现报错,为什么呢?原因在这里:

没错,tabBarController中的tabBar属性是readonly的,那么如何去修改它呢?这就要用到我们强大的KVC,不管在什么地方,不管是不是只读,我都可以去修改掉你。

[self setValue:[[XXXTabBar alloc] init] forKeyPath:@"tabBar"];
这样一来,我们就可以将tabBar替换为我们自己自定义的tabBar,效果和图1是一样的,这样是不是方便很多。

0 0
原创粉丝点击