• Home
  • About
    • 代码成诗 photo

      代码成诗

      善攻者必善守,而善守者,藏于九地之下

    • Learn More
    • Email
    • Twitter
    • Facebook
    • Github
    • Weibo
  • Posts
    • All Posts
    • All Tags
  • Projects

百思不得姐项目(二)

17 Oct 2016

Reading time ~3 minutes

百思不得姐项目(二)

前言

本文是在百思不得姐项目(一)基础上进行添加功能

一、自定义导航控制器

上篇文章已经实现的功能:。

1.1 创建自定义导航控制器

  • 在Other->Controller文件夹下新建自定义的导航控制器LaNavigationController

  • 创建好之后,我们在LaTabBarController.m中导入我们的导航控制器
#import "LaNavigationController.h"
  • 在 - (void)setUpChildVC:(UIViewController *)vc Title:(NSString *)title Image:(NSString *)image SelectImage:(NSString *)selectImage 方法中将以前的导航控制器改为我们自己的
// 包装导航控制器,添加导航控制器为tabBarController的子控制器
    LaNavigationController *navigationController = [[LaNavigationController alloc] initWithRootViewController:vc];

我们测试一下:在LaEssenceViewController.m中添加一个测试

@implementation LaEssenceViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UIViewController *vc = [[UIViewController alloc] init];
    vc.view.backgroundColor = [UIColor redColor];
    [self.navigationController pushViewController:vc animated:YES];
}

@end

运行结果:

1.2 更改导航栏返回按钮

目前我们的导航栏返回按钮是蓝色,并且显示为上一个节目的title,所以我们需要更改返回按钮。

//
//  LaNavigationController.m
//  百思不得姐
//
//  Created by 柳钰柯 on 2016/10/17.
//  Copyright © 2016年 柳钰柯. All rights reserved.
//

#import "LaNavigationController.h"

@interface LaNavigationController ()

@end

@implementation LaNavigationController

/**
 当第一次使用这个类的时候会调用一次
 */
+ (void)initialize{
    
    // 当导航栏用在LaNavigationController中才会生效
    //    UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:[self class], nil];
    
    UINavigationBar *bar = [UINavigationBar appearance];
    [bar setBackgroundImage:[UIImage imageNamed:@"navigationbarBackgroundWhite"] forBarMetrics:UIBarMetricsDefault];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

// 拦截pushViewController方法,更改导航栏的返回按钮
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated{
    
    if (self.childViewControllers.count > 0 ) {// >0指除开当前视图还有一个视图
        
        UIButton *returnButton = [UIButton buttonWithType:UIButtonTypeCustom]; // 自定义按钮
        [returnButton setTitle:@"返回" forState:UIControlStateNormal]; // 设置按钮字体
        [returnButton setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal]; // 设置正常情况下的按钮
        [returnButton setImage:[UIImage imageNamed:@"navigationButtonReturnClick"]forState:UIControlStateHighlighted]; // 设置高亮情况下的按钮
        
        [returnButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; // 设置正常情况下字体颜色
        [returnButton setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; // 设置高亮情况字体颜色
        
        returnButton.size = CGSizeMake(70, 30); // 设置按钮尺寸
        returnButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; // 设置按钮左对齐
        returnButton.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0); // 按钮向左移动
        
        [returnButton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; // 按钮绑定弹出事件
        
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:returnButton]; // 替换按钮
        viewController.hidesBottomBarWhenPushed = YES; // 隐藏TabBar
    }
    [super pushViewController:viewController animated:YES]; // 此句放在最后让viewController可以覆盖上面的leftBarButtonItem
}

// 监听返回按钮,弹出当前界面
- (void)back{
    [self popViewControllerAnimated:YES];
}

@end

运行效果:

1.3 设置当前视图导航栏按钮

  • 我们需要对每一个模块都添加按钮,按钮都有相同的属性(正常图片,高亮图片,事件绑定).所以我们需要先封装一个类来避免代码冗余.在Other->Category中添加一个UIBarButtonItem的类扩展
  • 在header.h中添加#import "UIBarButtonItem+LaExtension.h" 使整个工程可以使用这个类
  • 同时我们注意到,整个项目都是一个背景颜色,所以我们需要设置全局背景颜色,同样在Header.h中添加
#define LaRGBColor(r,g,b) [UIColor colorWithRed:(r) / 255.0 green:(g) / 255.0 blue:(b) / 255.0 alpha:1.0] // 宏->快速设置颜色
#define LaGlobalBg LaRGBColor(223,223,223) // 全局背景颜色
  • 自定义UIBarButtonItem
//
//  UIBarButtonItem+LaExtension.h
//  百思不得姐
//
//  Created by 柳钰柯 on 2016/10/17.
//  Copyright © 2016年 柳钰柯. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UIBarButtonItem (LaExtension)


/**
 UIBarButtonItem类扩展

 @param normalImage      正常图片
 @param highlightedImage 高亮图片
 @param action           绑定事件
 @param target           目标

 @return 返回一个BarButtonItem
 */
+ (instancetype)itemWithNormalImage:(NSString *)normalImage HighlightedImage:(NSString *)highlightedImage Action:(SEL)action Target:(id)target;

@end

==============================================================================================================================================
//
//  UIBarButtonItem+LaExtension.m
//  百思不得姐
//
//  Created by 柳钰柯 on 2016/10/17.
//  Copyright © 2016年 柳钰柯. All rights reserved.
//

#import "UIBarButtonItem+LaExtension.h"

@implementation UIBarButtonItem (LaExtension)

+ (instancetype)itemWithNormalImage:(NSString *)normalImage HighlightedImage:(NSString *)highlightedImage Action:(SEL)action Target:(id)target{
   
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; // 自定义按钮
    [button setBackgroundImage:[UIImage imageNamed:highlightedImage] forState:UIControlStateHighlighted]; // 设置高亮图片
    [button setBackgroundImage:[UIImage imageNamed:normalImage] forState:UIControlStateNormal]; // 设置正常图片
    button.size = button.currentBackgroundImage.size; // 设置按钮大小为当前图片大小
    [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
    
    // 包装为BarButtonIteam并返回
    return [[UIBarButtonItem alloc]initWithCustomView:button];
}

@end
  • 在每个类中创建item
//
//  LaEssenceViewController.m
//  百思不得姐
//
//  Created by 柳钰柯 on 2016/10/16.
//  Copyright © 2016年 柳钰柯. All rights reserved.
//

#import "LaEssenceViewController.h"

@interface LaEssenceViewController ()

@end

@implementation LaEssenceViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 设置导航栏内容
    self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MainTitle"]];
    
    // 设置左边按钮
    self.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithNormalImage:@"MainTagSubIcon" HighlightedImage:@"MainTagSubIconClick" Action:@selector(tagClick) Target:self];
    
    // 设置背景色
    self.view.backgroundColor = LaGlobalBg;
}


- (void)tagClick{
    NSLog(@"%s  line:%d",__func__,__LINE__);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    UIViewController *vc = [[UIViewController alloc] init];
    vc.view.backgroundColor = [UIColor redColor];
    [self.navigationController pushViewController:vc animated:YES];
}

@end
==============================================================================================================================================

//
//  LaMeViewController.m
//  百思不得姐
//
//  Created by 柳钰柯 on 2016/10/16.
//  Copyright © 2016年 柳钰柯. All rights reserved.
//

#import "LaMeViewController.h"

@interface LaMeViewController ()

@end

@implementation LaMeViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 设置导航栏内容
    self.navigationItem.title = @"我的";
    
    // 添加两个按钮,先添加的在右边
    self.navigationItem.rightBarButtonItems = @[
                                                [UIBarButtonItem itemWithNormalImage:@"mine-setting-icon" HighlightedImage:@"mine-setting-icon-click" Action:@selector(settingClick) Target:self],// 设置按钮
                                                [UIBarButtonItem itemWithNormalImage:@"mine-moon-icon" HighlightedImage:@"mine-moon-icon-click" Action:@selector(moonClick) Target:self] // 月亮按钮
                                                ];
    
    // 设置背景色
    self.view.backgroundColor = LaGlobalBg;
    NSLog(@"%s  line:%d",__func__,__LINE__);
}

- (void)settingClick{
    NSLog(@"%s  line:%d",__func__,__LINE__);
}

- (void)moonClick{
    NSLog(@"%s  line:%d",__func__,__LINE__);
}

@end

==============================================================================================================================================

//
//  LaNewViewController.m
//  百思不得姐
//
//  Created by 柳钰柯 on 2016/10/16.
//  Copyright © 2016年 柳钰柯. All rights reserved.
//

#import "LaNewViewController.h"

@interface LaNewViewController ()

@end

@implementation LaNewViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 设置导航栏内容
    self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"MainTitle"]];
    
    // 设置左边按钮
    self.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithNormalImage:@"MainTagSubIcon" HighlightedImage:@"MainTagSubIconClick" Action:@selector(tagClick) Target:self];
    
    // 设置背景色
    self.view.backgroundColor = LaGlobalBg;
}


- (void)tagClick{
    NSLog(@"%s  line:%d",__func__,__LINE__);
}
@end

==============================================================================================================================================

//
//  LaFriendTrendsViewController.m
//  百思不得姐
//
//  Created by 柳钰柯 on 2016/10/16.
//  Copyright © 2016年 柳钰柯. All rights reserved.
//

#import "LaFriendTrendsViewController.h"

@interface LaFriendTrendsViewController ()

@end

@implementation LaFriendTrendsViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 设置导航栏内容
    self.navigationItem.title = @"我的关注";
    
    // 设置左边按钮
    self.navigationItem.leftBarButtonItem = [UIBarButtonItem itemWithNormalImage:@"friendsRecommentIcon" HighlightedImage:@"friendsRecommentIcon-click" Action:@selector(friendClick) Target:self];
    
    // 设置背景色
    self.view.backgroundColor = LaGlobalBg;
}

- (void)friendClick{
    NSLog(@"%s  line:%d",__func__,__LINE__);
}


@end
  • 运行结果

结语

本篇文章介绍了导航栏的介绍,后续的一些情等待更新. 欢迎转载,不用询问,注明出处即可.



百思不得姐IOS Like Tweet +1