UINavigationController介绍:6-自定义导航栏(锤子便签)

转自hcios.com

1、“锤子便签”导航栏样例

“锤子便签”是目前非常流行的一款便签类工具App,整体设计非常简洁。本节主要用来实现锤子便签的两个主要界面导航栏,如下图所示。

  • 首页:首页导航栏有3个控件,左右按钮以及中间的标题;
  • 新提醒:新提醒界面的导航栏左侧有一个按钮,右侧有两个按钮,没有中间标题。

1.pic2.pic

2、实现透明导航栏

锤子便签的导航栏实现比较巧妙,整个控制器的视图使用了一个背景图片,背景图片中为导航栏展示了一个特殊区域,因此,在实际开发中,需要把系统自带的导航栏颜色设置为透明。以下代码请添加到导航控制器定义中。

 
 
  1. //设置BarStyle
  2. self.navigationBar.barStyle = UIBarStyleBlackTranslucent;
  3. //设置导航栏透明
  4. [self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
  5. self.navigationBar.shadowImage = [UIImage new];
  6. self.navigationBar.translucent = YES;

3、添加首页NavigationItem

在实际开发中navigationItem的左右按钮以及中间的titleView,一般都需要完全定制,通过定制才能够控制控件的位置、大小等外观属性。另外,还需要考虑到多尺寸屏幕的适配问题,因此需要定义宏(macro)来判定设备型号。

  • 新建一个Global.h文件,在文件中定义判定设备类型的宏;
 
 
  1. #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
  2. #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
  3. #define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)
  4.  
  5. #define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
  6. #define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
  7. #define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
  8. #define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
  9.  
  10. #define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
  11. #define IS_IPHONE_5AND5S (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
  12. #define IS_IPHONE_6AND6S (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
  13. #define IS_IPHONE_6PAND6SP (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
  • 在子控制器中,根据设备类型,计算偏移量;
 
 
  1. //根据设备计算偏移量
  2. CGFloat offsetY;
  3. if (IS_IPHONE_6AND6S) {
  4. offsetY = -8;
  5. }else if(IS_IPHONE_6PAND6SP) {
  6. offsetY = -15;
  7. }else {
  8. offsetY = 0;
  9. }
  • 添加titleView
 
 
  1. //TitleView
  2. UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 33)];
  3. titleLabel.text = @"锤子便签";
  4. titleLabel.textAlignment = NSTextAlignmentCenter;
  5. titleLabel.textColor = [UIColor whiteColor];
  6. UIView *centerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 33)];
  7. [centerView addSubview:titleLabel];
  8. centerView.bounds = CGRectOffset(centerView.bounds, 0, offsetY);
  9. self.navigationItem.titleView = centerView;
  • 添加左侧按钮
 
 
  1. //左侧按钮
  2. UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  3. leftBtn.frame = CGRectMake(0, 0, 44, 44);
  4. [leftBtn setBackgroundImage:[UIImage imageNamed:@"btn_bg_n"] forState:UIControlStateNormal];
  5. [leftBtn setBackgroundImage:[UIImage imageNamed:@"btn_bg_p"] forState:UIControlStateHighlighted];
  6. [leftBtn setImage:[UIImage imageNamed:@"btn_about"] forState:UIControlStateNormal];
  7. [leftBtn setImage:[UIImage imageNamed:@"btn_about"] forState:UIControlStateHighlighted];
  8. [leftBtn addTarget:self action:@selector(clickLeftBarButton) forControlEvents:UIControlEventTouchUpInside];
  9. UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
  10. [leftView addSubview:leftBtn];
  11. //调整位置
  12. leftView.bounds = CGRectOffset(leftView.bounds, 10, offsetY);
  13. UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:leftView];
  14. self.navigationItem.leftBarButtonItem = leftBarButtonItem;
  • 添加右侧按钮
 
 
  1. //右侧按钮
  2. UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  3. rightBtn.frame = CGRectMake(0, 0, 44, 44);
  4. [rightBtn setBackgroundImage:[UIImage imageNamed:@"btn_bg_n"] forState:UIControlStateNormal];
  5. [rightBtn setBackgroundImage:[UIImage imageNamed:@"btn_bg_p"] forState:UIControlStateHighlighted];
  6. [rightBtn setImage:[UIImage imageNamed:@"btn_new"] forState:UIControlStateNormal];
  7. [rightBtn setImage:[UIImage imageNamed:@"btn_new"] forState:UIControlStateHighlighted];
  8. [rightBtn addTarget:self action:@selector(clickRightBarButton) forControlEvents:UIControlEventTouchUpInside];
  9. UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
  10. [rightView addSubview:rightBtn];
  11. //调整位置
  12. rightView.bounds = CGRectOffset(rightView.bounds, -10, offsetY);
  13. UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightView];
  14. self.navigationItem.rightBarButtonItem = rightBarButtonItem;

4、添加“新提醒”页面NavigationItem

在“新提醒”界面下,右侧有两个按钮,这需要使用到navigationItem的rightBarButtonItems属性,把所有按钮都装到这个数组中。

  • 添加左侧按钮:注意要修改按钮文字的偏移量
 
 
  1. //左侧按钮
  2. UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  3. leftBtn.frame = CGRectMake(0, 0, 44, 44);
  4. [leftBtn setBackgroundImage:[UIImage imageNamed:@"btn_long_bg_n"] forState:UIControlStateNormal];
  5. [leftBtn setBackgroundImage:[UIImage imageNamed:@"btn_long_bg_p"] forState:UIControlStateHighlighted];
  6. [leftBtn setTitle:@"列表" forState:UIControlStateNormal];
  7. [leftBtn setTitle:@"列表" forState:UIControlStateHighlighted];
  8. [leftBtn.titleLabel setFont:[UIFont systemFontOfSize:12.0]];
  9. leftBtn.titleEdgeInsets = UIEdgeInsetsMake(0, 7, 0, 0);
  10. [leftBtn addTarget:self action:@selector(clickLeftBarButton) forControlEvents:UIControlEventTouchUpInside];
  11. UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 56, 44)];
  12. [leftView addSubview:leftBtn];
  13. //调整位置
  14. leftView.bounds = CGRectOffset(leftView.bounds, 10, offsetY);
  15. UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:leftView];
  16. self.navigationItem.leftBarButtonItem = leftBarButtonItem;
  17.  
  • 添加右侧两个按钮
 
 
  1. //右侧按钮
  2. UIButton *rightBtn1 = [UIButton buttonWithType:UIButtonTypeCustom];
  3. rightBtn1.frame = CGRectMake(0, 0, 44, 44);
  4. [rightBtn1 setBackgroundImage:[UIImage imageNamed:@"btn_bg_n"] forState:UIControlStateNormal];
  5. [rightBtn1 setBackgroundImage:[UIImage imageNamed:@"btn_bg_p"] forState:UIControlStateHighlighted];
  6. [rightBtn1 setImage:[UIImage imageNamed:@"btn_send"] forState:UIControlStateNormal];
  7. [rightBtn1 setImage:[UIImage imageNamed:@"btn_send"] forState:UIControlStateHighlighted];
  8. [rightBtn1 addTarget:self action:@selector(clickRightBarButton) forControlEvents:UIControlEventTouchUpInside];
  9. UIView *rightView1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
  10. [rightView1 addSubview:rightBtn1];
  11. //调整位置
  12. rightView1.bounds = CGRectOffset(rightView1.bounds, -10, offsetY);
  13. UIBarButtonItem *rightBarButtonItem1 = [[UIBarButtonItem alloc] initWithCustomView:rightView1];
  14. UIButton *rightBtn2 = [UIButton buttonWithType:UIButtonTypeCustom];
  15. rightBtn2.frame = CGRectMake(0, 0, 44, 44);
  16. [rightBtn2 setBackgroundImage:[UIImage imageNamed:@"btn_bg_n"] forState:UIControlStateNormal];
  17. [rightBtn2 setBackgroundImage:[UIImage imageNamed:@"btn_bg_p"] forState:UIControlStateHighlighted];
  18. [rightBtn2 setImage:[UIImage imageNamed:@"btn_camera"] forState:UIControlStateNormal];
  19. [rightBtn2 setImage:[UIImage imageNamed:@"btn_camera"] forState:UIControlStateHighlighted];
  20. [rightBtn2 addTarget:self action:@selector(clickRightBarButton) forControlEvents:UIControlEventTouchUpInside];
  21. UIView *rightView2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
  22. [rightView2 addSubview:rightBtn2];
  23. //调整位置
  24. rightView2.bounds = CGRectOffset(rightView2.bounds, -10, offsetY);
  25. UIBarButtonItem *rightBarButtonItem2 = [[UIBarButtonItem alloc] initWithCustomView:rightView2];
  26. NSArray *rightItems = @[rightBarButtonItem1,rightBarButtonItem2];
  27. self.navigationItem.rightBarButtonItems = rightItems;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值