中间凸出(百思tabbar上面修改) 按钮范围,nav改色。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中间凸出(百思tabbar上面修改) 按钮范围,nav改色。相关的知识,希望对你有一定的参考价值。

//
//  WMTabBarController.m
//  百思不得姐
//
//  Created by 王蒙 on 15/7/22.
//  Copyright (c) 2015年 wm. All rights reserved.
//

#import "WMTabBarController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
#import "WMTabBar.h"
#import "RootViewController.h"
#import "ShopHomeViewController.h"
#import "CRMViewController.h"
#import "WMNavigationController.h"
#import "JHBViewController.h"
#import "OrderListViewController.h"
@interface WMTabBarController ()<UITabBarDelegate>
{
   JHBViewController* jhb;
}
@end

@implementation WMTabBarController


+ (void)initialize{

    NSMutableDictionary *arrText = [NSMutableDictionary dictionary];
    arrText[NSFontAttributeName] = [UIFont systemFontOfSize:12];
    arrText[NSForegroundColorAttributeName] = [UIColor grayColor];
    NSMutableDictionary *selText = [NSMutableDictionary dictionary];
    selText[NSFontAttributeName] = [UIFont systemFontOfSize:12];
    selText[NSForegroundColorAttributeName] = [UIColor blackColor];
    UITabBarItem *item = [UITabBarItem appearance];
    [item setTitleTextAttributes:arrText forState:UIControlStateNormal];
    [item setTitleTextAttributes:selText forState:UIControlStateSelected];
    
}
- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pushCenter) name:@"pushCenter" object:nil];
    [self setUpVCTitle];
    
}

#pragma mark -创建vc控制器 tabbr替换
- (void)setUpVCTitle{

    [self setUpChildVC:[[FirstViewController alloc] init] image:[UIImage imageNamed:@"firstpage"] selImage:[UIImage imageNamed:@"firstpage_on"] title:@"首页"];
    
    [self setUpChildVC:[[ShopHomeViewController alloc] init] image:[UIImage imageNamed:@"dianpu"] selImage:[UIImage imageNamed:@"dianpu_on"] title:@"店铺"];
    
    [self setUpChildVC:[[CRMViewController alloc] init] image:[UIImage imageNamed:@"crm"] selImage:[UIImage imageNamed:@"crm_on"] title:@"CRM"];
  
     jhb = [[JHBViewController alloc] init];
    [self setUpChildVC:jhb image:[UIImage imageNamed:@"jinhuo"] selImage:[UIImage imageNamed:@"jinhuo_on"] title:@"进货"];
    
    //替换tabBar
    [self setValue:[[WMTabBar alloc] init] forKeyPath:@"tabBar"];

}

#pragma mark - 点击中间按钮时通知收到消息调用此方法
- (void)pushCenter{

    if ([[UIApplication sharedApplication].keyWindow.rootViewController isKindOfClass:[WMTabBarController class]]) {
        RootViewController *vc = [[RootViewController alloc] init];
        [vc setHidesBottomBarWhenPushed:YES];
        [self.selectedViewController pushViewController:vc animated:YES];
    }
    NSLog(@"push2");

}
#pragma mark - 设置切换控制器
- (void)setUpChildVC:(UIViewController*)vc image:(UIImage*)image selImage:(UIImage*)selImage title:(NSString*)title{
   
    vc.tabBarItem.title = title;
    [vc.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor colorWithRed:0.35 green:0.76 blue:0.96 alpha:1.000],NSForegroundColorAttributeName, nil] forState:UIControlStateSelected];
    [vc.tabBarItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIColor blackColor],NSForegroundColorAttributeName, nil] forState:UIControlStateNormal];
    vc.tabBarItem.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    vc.tabBarItem.selectedImage = [selImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:vc];
    [nvc.navigationBar setTitleTextAttributes:@{
                                                 NSForegroundColorAttributeName:[UIColor whiteColor]
                                                 }];
    nvc.navigationBar.tintColor = [UIColor whiteColor];
    [nvc.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, -20, kScreenWidth, 64)];
    view.userInteractionEnabled = NO;
    view.backgroundColor = kbluemainColor;
    [nvc.navigationBar insertSubview:view atIndex:0];
    [self addChildViewController:nvc];

}


#pragma mark - UITabBarDelegate 点击tabbar上面的四个按钮
-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)Item{
    
    if ([Item.title isEqualToString:@"进货"]) {

[[NSUserDefaults standardUserDefaults] setObject:@"jhb" forKey:@"thename"]; [[NSUserDefaults standardUserDefaults] synchronize]; self.tabBar.hidden = YES; [jhb loadView]; }else{ self.tabBar.hidden = NO; } } -(void)showTabBar { if (self.tabBar.hidden) { self.tabBar.hidden = NO; } } -(void)hideTabBar { if (!self.tabBar.hidden) { self.tabBar.hidden = YES; } } @end
#import "WMTabBar.h"
#import "UIImage+Color.h"

@interface WMTabBar()
/**按钮*/
{
    JHBViewController *jhb;
    NSInteger btnheight;
}
@property (nonatomic,weak) UIButton *pushBtn;

@end
@implementation WMTabBar

- (instancetype)initWithFrame:(CGRect)frame{

    self = [super initWithFrame:frame];
    if (self) {
        btnheight = 80;
        [self  setShadowImage:[UIImage imageWithColor:[UIColor clearColor]]];
        self.backgroundImage =[UIImage imageWithColor:[UIColor clearColor]];//去除黑线
        UIView *line = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.bounds.size.width, 1)];//把黑线重新加上,这样黑线可以在按钮下面了
        line.backgroundColor = [UIColor grayColor];
        [self addSubview:line];
        
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setTitle:@"扫一扫" forState:UIControlStateNormal];
        [btn setImage:[UIImage imageNamed:@"saoma"] forState:UIControlStateNormal];
        [btn setImage:[UIImage imageNamed:@"saoma"] forState:UIControlStateHighlighted];
        [btn setTitleColor: [UIColor blackColor] forState:UIControlStateNormal];
        [btn setTitleColor: kbluemainColor forState:UIControlStateHighlighted];
        [btn addTarget:self action:@selector(pushlishVC) forControlEvents:UIControlEventTouchUpInside];
        btn.titleLabel.font = [UIFont systemFontOfSize:10.f];

        if (iPhone4){
            [btn setImageEdgeInsets:UIEdgeInsetsMake(0, 8, 0, 0)];
            [btn setTitleEdgeInsets:UIEdgeInsetsMake(0, -[UIScreen mainScreen].bounds.size.width/5+14, -btnheight+15, 0)];
        }else if (iPhone5) {
            [btn setImageEdgeInsets:UIEdgeInsetsMake(0, 8, 0, 0)];
            [btn setTitleEdgeInsets:UIEdgeInsetsMake(0, -[UIScreen mainScreen].bounds.size.width/5+20, -btnheight+15, 0)];
        }else if (iPhone6){
            [btn setImageEdgeInsets:UIEdgeInsetsMake(3, 12, 0, 0)];
            [btn setTitleEdgeInsets:UIEdgeInsetsMake(0, -[UIScreen mainScreen].bounds.size.width/5+30, -btnheight+15, 0)];
        }else if (iPhone6Plus){
            [btn setImageEdgeInsets:UIEdgeInsetsMake(0, 11, 0, 0)];
            [btn setTitleEdgeInsets:UIEdgeInsetsMake(0, -[UIScreen mainScreen].bounds.size.width/5+42, -btnheight+15, 0)];
        }
        
        [self addSubview:btn];
        self.pushBtn = btn;
        [self setBackgroundImage:[UIImage imageNamed:@"tabbar-light"]];

    }
    return  self;
}

#pragma mark -  重写hitTest方法,去监听发布按钮的点击,目的是为了让凸出的部分点击也有反应
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    
    //这一个判断是关键,不判断的话push到其他页面,点击发布按钮的位置也是会有反应的,这样就不好了
    //self.isHidden == NO 说明当前页面是有tabbar的,那么肯定是在导航控制器的根控制器页面
    //在导航控制器根控制器页面,那么我们就需要判断手指点击的位置是否在发布按钮身上
    //是的话让发布按钮自己处理点击事件,不是的话让系统去处理点击事件就可以了
    if (self.isHidden == NO) {
        
        //将当前tabbar的触摸点转换坐标系,转换到发布按钮的身上,生成一个新的点
        CGPoint newP = [self convertPoint:point toView:self.pushBtn];
        
        //判断如果这个新的点是在发布按钮身上,那么处理点击事件最合适的view就是发布按钮
        if ( [self.pushBtn pointInside:newP withEvent:event]) {
            return self.pushBtn;
        }else{//如果点不在发布按钮身上,直接让系统处理就可以了
            return [super hitTest:point withEvent:event];
        }
    }
    else {//tabbar隐藏了,那么说明已经push到其他的页面了,这个时候还是让系统去判断最合适的view处理就好了
        return [super hitTest:point withEvent:event];
    }
}


#pragma mark - 点击中间凸出按钮
- (void)pushlishVC{
    
    [[NSNotificationCenter defaultCenter] postNotificationName:@"pushCenter" object:nil userInfo: nil];
    
}

#pragma mark - 布局
- (void)layoutSubviews{

    [super layoutSubviews];
    
    static BOOL isClick = NO;
    //对按钮进行布局
    CGSize tabBarWH = self.frame.size;
    self.pushBtn.height = 80;
    self.pushBtn.width = [UIScreen mainScreen].bounds.size.width/5;
    self.pushBtn.center = CGPointMake(tabBarWH.width*0.5, tabBarWH.height*0);
    CGFloat buttonY = 0;
    CGFloat buttonW = tabBarWH.width / 5;
    CGFloat buttonH = tabBarWH.height;
    NSInteger index = 0;
    //对子控件进行布局
    for (UIControl *btn in self.subviews) {
        if (![btn isKindOfClass:NSClassFromString(@"UITabBarButton")])continue;
        CGFloat buttonX = buttonW * ((index > 1)?(index + 1):index);
        btn.frame = CGRectMake(buttonX, buttonY, buttonW, buttonH);
        
        index++;
        
        if (isClick == NO) {
            
            [btn addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
        }
    }
    isClick = YES;

}

//发送通知
- (void)onClick{
   
    NSLog(@"onClick");

}

坐标可能有别人写好的分类。不用判断一个个调,暂时没有找到。

以上是关于中间凸出(百思tabbar上面修改) 按钮范围,nav改色。的主要内容,如果未能解决你的问题,请参考以下文章

修改代码以添加主页按钮

设置tabBar中间的按钮比较大的发布

在自定义的tabbar 中间按钮 点击出现一个view 再点击view返回

iOS开发简记:自定义tabbar

ios定制中间突出的tabBar

百思不得姐框架