美文网首页
自定义 Tabbar 控制器中间按钮

自定义 Tabbar 控制器中间按钮

作者: 黑暗森林的歌者 | 来源:发表于2017-11-23 17:37 被阅读88次
    示例

    自定义 主控制器

    自定义 MainTabBarViewController 继承于 UITabBarController

    这个控制器引用 UITabBarControllerDelegate,通过这个代理的方法获取到当前点击的 tabbarItem

    self.delegate = self;
    

    添加子控制器

    - (void)addChildViewControllers {
        // 根据需求在这里添加子控制器
        HomeViewController *home = [[HomeViewController alloc] init];
        [self addTabItem:home image:nil selectedImage:nil title:@" 首页"];
        
        // 在中间的位置添加一个空的控制器,这样做是为了让底部的 tabbar 排版更好看,加号按钮刚好在中间的这个 item 位置
        UIViewController *ctrl = [[UIViewController alloc] init];
        [self addTabItem:ctrl image:nil selectedImage:nil title:@" "];
        
        MineViewController *mine = [[MineViewController alloc] init];
        [self addTabItem:mine image:nil selectedImage:nil title:@"我的"];
    }
    

    添加 tabbar

    - (void)addTabItem:(UIViewController *)controller image:(UIImage *)image selectedImage:(UIImage *)selectedImage title:(NSString *)title {
        controller.navigationItem.title = title ;
        controller.title = title; //同时设置tabBar和nav的title
        controller.tabBarItem.image = image;
        controller.tabBarItem.selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];;
        
        // 调整tabBarItem的图片 和 文字的位置
        controller.tabBarItem.imageInsets = UIEdgeInsetsMake(-5, 0, 5, 0);
        controller.tabBarItem.titlePositionAdjustment = UIOffsetMake(0, -5);
        
        [self addChildViewController:controller];
    }
    

    自定义加号按钮

    -(void)addCenterButtonWithImage:(UIImage*)buttonImage selectedImage:(UIImage*)selectedImage {
        self.plusBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        self.plusBtn.clipsToBounds = YES;
        self.plusBtn.layer.cornerRadius = 30;
        [self.plusBtn addTarget:self action:@selector(clickedPlusBtn:) forControlEvents:UIControlEventTouchUpInside];
        self.plusBtn.autoresizingMask = UIViewAutoresizingFlexibleRightMargin
                                        | UIViewAutoresizingFlexibleLeftMargin
                                        | UIViewAutoresizingFlexibleBottomMargin
                                        | UIViewAutoresizingFlexibleTopMargin;
        
        //  设定button大小为适应图片
        self.plusBtn.frame = CGRectMake(0.0, 0.0, 60, 60);
        [self.plusBtn setImage:buttonImage forState:UIControlStateNormal];
        [self.plusBtn setImage:selectedImage forState:UIControlStateSelected];    
        
        //  这个比较恶心  去掉选中button时候的阴影
        self.plusBtn.adjustsImageWhenHighlighted = NO;
        CGPoint center = self.tabBar.center;
        center.y = center.y - 30;
        self.plusBtn.center = center;
        
        //按钮就放在当前主控制器的 view 上
        [self.view addSubview:self.plusBtn];
    }
    

    按钮点击

    -(void)clickedPlusBtn:(id)sender {
        // 点击加号需要的操作
        // 如果要是push 或者 present 新的界面,最好是用根控制器的 navigationControler
    }
    

    拦截 tabbar 的点击

    //每次点击tabBarItem后触发这个方法
    - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
        if (self.selectedIndex == 1) { // 因为加号按钮添加到了下标为 1 的 item 上面,所以如果点击到这个位置,就过滤掉这个 item 的响应
            return;
        }
        self.title  = viewController.title;
    }
    
    //点击中间的 tablebar 拦截
    // 因为加号按钮添加到了下标为 1 的 item 上面,所以如果点击到这个位置,就过滤掉这个 item 的响应
    - (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
        if (viewController == [tabBarController.viewControllers objectAtIndex:1]) {
            return NO;
        }
        return YES;
    }
    

    相关文章

      网友评论

          本文标题:自定义 Tabbar 控制器中间按钮

          本文链接:https://www.haomeiwen.com/subject/tlttbxtx.html