自定义导航条的前提是隐藏系统自带的导航条
创建自定义的导航条视图,当前控制器将需要添加的东西告知自定义导航条视图,然后导航条视图去创建。

当前视图控制器做的事情
初始化需要添加到自定义导航条视图的对象
 
    // 设置状态栏的风格
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
    
    // 隐藏系统自带导航条
    self.navigationController.navigationBarHidden = YES;
    //    [self.navigationController setNavigationBarHidden:YES];
    
    
    UIView *redView = [[UIView alloc] init];
    redView.frame = CGRectMake(0, 0, 50, 30);
    redView.backgroundColor = [UIColor redColor];
    
    // 自定义Item 左边Item
    MyNavigationItem *leftItem1 = [[MyNavigationItem alloc] init];
    leftItem1.itemTitle = @"left1";
    leftItem1.itemBgImageName = @"buttonbar_action.png";
    
    MyNavigationItem *leftItem2 = [[MyNavigationItem alloc] init];
    leftItem2.itemTitle = @"left2";
    leftItem2.itemBgImageName = @"buttonbar_action.png";
    NSArray *leftItems = @[leftItem1,leftItem2];
    
    // 自定义Item 右边Item
    MyNavigationItem *rightItem1 = [[MyNavigationItem alloc] init];
    rightItem1.itemTitle = @"right1";
    rightItem1.itemBgImageName = @"buttonbar_action.png";
    
    MyNavigationItem *rightItem2 = [[MyNavigationItem alloc] init];
    rightItem2.itemTitle = @"right2";
    rightItem2.itemBgImageName = @"buttonbar_action.png";
    NSArray *rightItems = @[rightItem1,rightItem2];
MyNavigationBar *myNavigationBar = [[MyNavigationBar alloc] init];
    myNavigationBar.frame = CGRectMake(0, 20, 320, 44); // 之前的导航条的位置
    
    [myNavigationBar creatrMyNavigationBarWithImageName:@"navigationbar.png"
                                                  title:nil
                                              titleView:redView
                                              leftItems:leftItems
                                             rightItems:rightItems
                                                  class:self // 将事件的监听对象和事件的响应方法传递给myNavigatioBar 绑定
                                                    sel:@selector(itemClick:)];
    [self.view addSubview:myNavigationBar];
}



自定义导航条视图创建和自定义标签栏视图大同小异 。
自定义导航条视图一般都比自定义标签栏视图麻烦一点,因为自定义导航条视图需要创建左右items,而自定义标签视图只需要创建按顺序排列的items。所以说自定义导航条视图需要判断items是在标题的左边还是右边,才能确定位置来创建



/**
 *  自定义导航条
 *
 *  @param bgImageName 有一个背景图片来创建背景视图
 *  @param title       自定义标题内容
 *  @param titleView   自定义标题视图
 *  @param leftItems   左边barButtonItem
 *  @param rightItems  右边barButtonItem
 *  @param classobject button绑定对象
 *  @param sel         button响应事件
 */
- (void)creatrMyNavigationBarWithImageName:(NSString *)bgImageName
                                     title:(NSString *)title
                                 titleView:(UIView *)titleView
                                 leftItems:(NSArray *)leftItems
                                rightItems:(NSArray *)rightItems
                                     class:(id)classobject
                                       sel:(SEL)sel {
    
    // 1. 加载背景图片
    [self creatBgImageViewWithBgImageName:bgImageName];
    
    // 2. 设置标题
    if (title.length > 0) { // 如果title存在,我们创建titleLabel
        
        [self createTitleLabelWithTitle:title];
        
    }
    // 3. 设置标题视图
    if (titleView) {
        
        [self createTitleViewWithView:titleView];
        
    }
    
    // 4. 设置items
    // 左边起始值
    CGFloat itemx = 0.0f;
    // 右边起始值
    CGFloat itemx2 = 320.0f;
    
    if (leftItems.count > 0) {
        
        for (int i = 0; i < leftItems.count; i++) {
         
            // 创建导航条中的导航条目  左边
           itemx = [self createItemWithNavigationItem:[leftItems objectAtIndex:i] isLeft:YES index:i x:itemx + 5.f class:classobject sel:sel];
            // 左边每次创建完1个都要返回其图片右边的位置 方便下一个创建安排位置
            
        }
    }
    if (rightItems.count > 0) {
        
        for (int j = 0; j < rightItems.count; j++) {
            
            // 创建导航条中的导航条目  右边
            itemx2 = [self createItemWithNavigationItem:[rightItems objectAtIndex:j] isLeft:NO index:j x:itemx2 - 5.f class:classobject sel:sel];
             // 右边每次创建完1个都要返回其图片左边的位置 方便下一个创建安排位置
        }
    }
    
    
    
}

/** 创建背景视图 */
- (void)creatBgImageViewWithBgImageName:(NSString *)bgImageName {
    
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:bgImageName]];
    NSLog(@"%f %f %f %f",self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
     NSLog(@"%f %f %f %f",self.bounds.origin.x,self.bounds.origin.y,self.bounds.size.width,self.bounds.size.height);
    // bounds xy不管怎么设置都是原点
    /**
     *   因为此imageView 需要加到 self 上 
        所以如果想要和self 位置相同,就必须要要设置frame为self的bounds
        因为子视图的frame是以父视图为参照的,
     */
    imageView.frame = self.bounds;
    [self addSubview:imageView];
    
}


/** 标题 */
- (void)createTitleLabelWithTitle:(NSString *)title {
    
    UILabel *label = [[UILabel alloc] init];
    // label大小
    label.frame = self.bounds;
    // label内容
    label.text = title;
    // label对齐方式
    label.textAlignment = NSTextAlignmentCenter;
    // label字体样式
    label.font = [UIFont boldSystemFontOfSize:28];
    
    label.textColor = [UIColor colorWithRed:00.0f green:0.62f blue:0.92f alpha:1.00f];

    [self addSubview:label];
}

/** 标题视图 */
- (void)createTitleViewWithView:(UIView *)view {
    
     NSLog(@"%f",self.center.x);
    NSLog(@"%f",self.center.y);
    
    NSLog(@"%f",self.frame.size.height/2);
    
    view.center = CGPointMake(self.center.x, self.frame.size.height/2);
    // 子视图的位置以父视图为参照,
      NSLog(@"%f %f %f %f",view.frame.origin.x,view.frame.origin.y,view.frame.size.width,view.frame.size.height);
       NSLog(@"%f %f %f %f",view.bounds.origin.x,view.bounds.origin.y,view.bounds.size.width,view.bounds.size.height);
    [self addSubview:view];
    
}

/** 创建item */ // 返回一个x坐标
/**
 *  创建item们
 *
 *  @param item        提供imte名字和图片名字
 *  @param isLeft      判断是否为左边item以便安排左边
 *  @param index       给button一个tag
 *  @param x           item按钮的起始位置
 *  @param classObject   事件的监听对象
 *  @param sel         事件的方法
 *
 *  @return <#return value description#>
 */
- (CGFloat)createItemWithNavigationItem:(MyNavigationItem *)item
                              isLeft:(BOOL)isLeft
                               index:(int)index
                                   x:(CGFloat)x
                               class:(id)classObject
                                 sel:(SEL)sel {
    
    // 取到item的背景图片
    NSString *bgImageName = item.itemBgImageName;
    UIImage *bgImage = [UIImage imageNamed:bgImageName];

    // 自定义button
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    
    if (!isLeft) {
        
         button.frame = CGRectMake(x - bgImage.size.width, (self.bounds.size.height-bgImage.size.height)/2, bgImage.size.width, bgImage.size.height); // 子视图y对应父视图 父视图高/2-子视图高/2
        
    } else {
        
         button.frame = CGRectMake(x , (self.bounds.size.height-bgImage.size.height)/2, bgImage.size.width, bgImage.size.height);
    }
   
    
    // 设置标题
    [button setTitle:item.itemTitle forState:UIControlStateNormal];
    
    // 设置背景图片
    [button setBackgroundImage:bgImage forState:UIControlStateNormal];
    
    // 添加事件
//    classObject - > viewController
//    sel - > viewController 要执行的事件
    [button addTarget:classObject action:sel forControlEvents:UIControlEventTouchUpInside];
    
    button.tag = index;
    
    [self addSubview:button];
    
    if (!isLeft) {
        
        return x - bgImage.size.width;
        
    } else {
        
        return x + bgImage.size.width;
        
    }
 
}