文中代码来源:LLTabBar。
设计思路:系统自带的tabBar做不到这个要求,所以可以在系统的tabBar上添加一个view来展示。那么问题来了,如何在我们新增的view上面处理点击事件?接下来看代码。
LLTabBar
LLTabBar *tabBar = [[LLTabBar alloc] initWithFrame:self.tabBar.bounds];
tabBar.delegate = self;
//中间省略tabBarItems的生成代码
tabBar.tabBarItems = tabBarItems;
[self.tabBar addSubview:tabBar];
LLTabBar是一个view,创建LLTabBar的时候将系统tabBar的大小给了它。所以完全遮盖住了系统自带的tabBar。设置的代理下面会讲到。tabBarItems是LLTabBar定义的一个数组,里面包含的是底部的所有菜单项。之后将tabBar作为子view添加到系统自带的tabBar上。
LLTabBarItem
LLTabBarItem是一个button,可以在上面设置要显示的文本和图片。这里的item要分两种考虑,一种是普通的,就跟系统自带的一模一样;另一种是特殊的,专门用于发布按钮的,这里使用tabBarItemType来进行区分。可以对它添加点击事件,当点击到某个item时,LLTabBar做出响应。代码如下:
- (void)itemSelected:(LLTabBarItem *)sender {
if (sender.tabBarItemType != LLTabBarItemRise){
[self setSelectedIndex:sender.tag]; //一般的item
}else{
//专门针对发布按钮的item
if (self.delegate) {
if ([self.delegate respondsToSelector:@selector(tabBarDidSelectedRiseButton)]) {
[self.delegate tabBarDidSelectedRiseButton];
}
}
}
}
对于一般的item来讲,我们需要模仿系统自带的tabBar的选中的效果。在处理的时候要注意一点:调用系统自带的选中方法后还需要处理被选中按钮的样式。这是因为我们现在看到的tabBar是我们自己的,系统自带的方法是没办法影响到我们这个view的。如下:
- (void)setSelectedIndex:(NSInteger)index {
for (UIButton *item in self.tabBarItems) {
//需要执行这个,否则没有选中效果
if (item.tag == index) {
item.selected = YES;
} else {
item.selected = NO;
}
}
UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window];
UITabBarController *tabBarController = (UITabBarController *)keyWindow.rootViewController;
if (tabBarController) {
tabBarController.selectedIndex = index;
}
}
对于专门针对发布按钮的点击,则利用代理方法放在外面的VC处理。效果如下:
网友评论