UINavigationController介绍:6-自定义导航栏(锤子便签)
转自hcios.com
1、“锤子便签”导航栏样例
“锤子便签”是目前非常流行的一款便签类工具App,整体设计非常简洁。本节主要用来实现锤子便签的两个主要界面导航栏,如下图所示。
- 首页:首页导航栏有3个控件,左右按钮以及中间的标题;
- 新提醒:新提醒界面的导航栏左侧有一个按钮,右侧有两个按钮,没有中间标题。
2、实现透明导航栏
锤子便签的导航栏实现比较巧妙,整个控制器的视图使用了一个背景图片,背景图片中为导航栏展示了一个特殊区域,因此,在实际开发中,需要把系统自带的导航栏颜色设置为透明。以下代码请添加到导航控制器定义中。
- //设置BarStyle
- self.navigationBar.barStyle = UIBarStyleBlackTranslucent;
- //设置导航栏透明
- [self.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
- self.navigationBar.shadowImage = [UIImage new];
- self.navigationBar.translucent = YES;
3、添加首页NavigationItem
在实际开发中navigationItem的左右按钮以及中间的titleView,一般都需要完全定制,通过定制才能够控制控件的位置、大小等外观属性。另外,还需要考虑到多尺寸屏幕的适配问题,因此需要定义宏(macro)来判定设备型号。
- 新建一个Global.h文件,在文件中定义判定设备类型的宏;
- #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
- #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
- #define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)
- #define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
- #define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
- #define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
- #define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
- #define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
- #define IS_IPHONE_5AND5S (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
- #define IS_IPHONE_6AND6S (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
- #define IS_IPHONE_6PAND6SP (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
- 在子控制器中,根据设备类型,计算偏移量;
- //根据设备计算偏移量
- CGFloat offsetY;
- if (IS_IPHONE_6AND6S) {
- offsetY = -8;
- }else if(IS_IPHONE_6PAND6SP) {
- offsetY = -15;
- }else {
- offsetY = 0;
- }
- 添加titleView
- //TitleView
- UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 33)];
- titleLabel.text = @"锤子便签";
- titleLabel.textAlignment = NSTextAlignmentCenter;
- titleLabel.textColor = [UIColor whiteColor];
- UIView *centerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 33)];
- [centerView addSubview:titleLabel];
- centerView.bounds = CGRectOffset(centerView.bounds, 0, offsetY);
- self.navigationItem.titleView = centerView;
- 添加左侧按钮
- //左侧按钮
- UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
- leftBtn.frame = CGRectMake(0, 0, 44, 44);
- [leftBtn setBackgroundImage:[UIImage imageNamed:@"btn_bg_n"] forState:UIControlStateNormal];
- [leftBtn setBackgroundImage:[UIImage imageNamed:@"btn_bg_p"] forState:UIControlStateHighlighted];
- [leftBtn setImage:[UIImage imageNamed:@"btn_about"] forState:UIControlStateNormal];
- [leftBtn setImage:[UIImage imageNamed:@"btn_about"] forState:UIControlStateHighlighted];
- [leftBtn addTarget:self action:@selector(clickLeftBarButton) forControlEvents:UIControlEventTouchUpInside];
- UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
- [leftView addSubview:leftBtn];
- //调整位置
- leftView.bounds = CGRectOffset(leftView.bounds, 10, offsetY);
- UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:leftView];
- self.navigationItem.leftBarButtonItem = leftBarButtonItem;
- 添加右侧按钮
- //右侧按钮
- UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeCustom];
- rightBtn.frame = CGRectMake(0, 0, 44, 44);
- [rightBtn setBackgroundImage:[UIImage imageNamed:@"btn_bg_n"] forState:UIControlStateNormal];
- [rightBtn setBackgroundImage:[UIImage imageNamed:@"btn_bg_p"] forState:UIControlStateHighlighted];
- [rightBtn setImage:[UIImage imageNamed:@"btn_new"] forState:UIControlStateNormal];
- [rightBtn setImage:[UIImage imageNamed:@"btn_new"] forState:UIControlStateHighlighted];
- [rightBtn addTarget:self action:@selector(clickRightBarButton) forControlEvents:UIControlEventTouchUpInside];
- UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
- [rightView addSubview:rightBtn];
- //调整位置
- rightView.bounds = CGRectOffset(rightView.bounds, -10, offsetY);
- UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rightView];
- self.navigationItem.rightBarButtonItem = rightBarButtonItem;
4、添加“新提醒”页面NavigationItem
在“新提醒”界面下,右侧有两个按钮,这需要使用到navigationItem的rightBarButtonItems属性,把所有按钮都装到这个数组中。
- 添加左侧按钮:注意要修改按钮文字的偏移量
- //左侧按钮
- UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
- leftBtn.frame = CGRectMake(0, 0, 44, 44);
- [leftBtn setBackgroundImage:[UIImage imageNamed:@"btn_long_bg_n"] forState:UIControlStateNormal];
- [leftBtn setBackgroundImage:[UIImage imageNamed:@"btn_long_bg_p"] forState:UIControlStateHighlighted];
- [leftBtn setTitle:@"列表" forState:UIControlStateNormal];
- [leftBtn setTitle:@"列表" forState:UIControlStateHighlighted];
- [leftBtn.titleLabel setFont:[UIFont systemFontOfSize:12.0]];
- leftBtn.titleEdgeInsets = UIEdgeInsetsMake(0, 7, 0, 0);
- [leftBtn addTarget:self action:@selector(clickLeftBarButton) forControlEvents:UIControlEventTouchUpInside];
- UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 56, 44)];
- [leftView addSubview:leftBtn];
- //调整位置
- leftView.bounds = CGRectOffset(leftView.bounds, 10, offsetY);
- UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:leftView];
- self.navigationItem.leftBarButtonItem = leftBarButtonItem;
- 添加右侧两个按钮
- //右侧按钮
- UIButton *rightBtn1 = [UIButton buttonWithType:UIButtonTypeCustom];
- rightBtn1.frame = CGRectMake(0, 0, 44, 44);
- [rightBtn1 setBackgroundImage:[UIImage imageNamed:@"btn_bg_n"] forState:UIControlStateNormal];
- [rightBtn1 setBackgroundImage:[UIImage imageNamed:@"btn_bg_p"] forState:UIControlStateHighlighted];
- [rightBtn1 setImage:[UIImage imageNamed:@"btn_send"] forState:UIControlStateNormal];
- [rightBtn1 setImage:[UIImage imageNamed:@"btn_send"] forState:UIControlStateHighlighted];
- [rightBtn1 addTarget:self action:@selector(clickRightBarButton) forControlEvents:UIControlEventTouchUpInside];
- UIView *rightView1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
- [rightView1 addSubview:rightBtn1];
- //调整位置
- rightView1.bounds = CGRectOffset(rightView1.bounds, -10, offsetY);
- UIBarButtonItem *rightBarButtonItem1 = [[UIBarButtonItem alloc] initWithCustomView:rightView1];
- UIButton *rightBtn2 = [UIButton buttonWithType:UIButtonTypeCustom];
- rightBtn2.frame = CGRectMake(0, 0, 44, 44);
- [rightBtn2 setBackgroundImage:[UIImage imageNamed:@"btn_bg_n"] forState:UIControlStateNormal];
- [rightBtn2 setBackgroundImage:[UIImage imageNamed:@"btn_bg_p"] forState:UIControlStateHighlighted];
- [rightBtn2 setImage:[UIImage imageNamed:@"btn_camera"] forState:UIControlStateNormal];
- [rightBtn2 setImage:[UIImage imageNamed:@"btn_camera"] forState:UIControlStateHighlighted];
- [rightBtn2 addTarget:self action:@selector(clickRightBarButton) forControlEvents:UIControlEventTouchUpInside];
- UIView *rightView2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
- [rightView2 addSubview:rightBtn2];
- //调整位置
- rightView2.bounds = CGRectOffset(rightView2.bounds, -10, offsetY);
- UIBarButtonItem *rightBarButtonItem2 = [[UIBarButtonItem alloc] initWithCustomView:rightView2];
- NSArray *rightItems = @[rightBarButtonItem1,rightBarButtonItem2];
- self.navigationItem.rightBarButtonItems = rightItems;
UINavigationController介绍:6-自定义导航栏(锤子便签)相关推荐
- flutter制作具有自定义导航栏的渐进式 Web 应用程序
本文主要介绍具有自定义导航栏的渐进式 Web 应用程序 gitee github 哔哩哔哩 第一节 第二节 第三节 让我们准备我们的 - "Main.dart" 我们将整个页面分成 ...
- iOS个人中心渐变动画、微信对话框、标签选择器、自定义导航栏、短信验证输入框等源码...
iOS精选源码 简单的个人中心页面-自定义导航栏并予以渐变动画 程序员取悦女票的正确姿势---Tip1(iOS美容篇) iOS 前台重启应用和清除角标的问题 微信原生提醒对话框3.0 JHLikeBu ...
- 【小程序】自定义导航栏
这个需求要不是UI和我讲有其他小程序实现了,我都还以为小程序还不能做到自定义导航.还好是在设计阶段给出的需求,不然... 先看看效果吧 微信小程序自定义导航栏 开始接介绍用法: 1:配置app.jso ...
- ie9 java小程序设置_小程序 自定义导航栏
一.概念 上面整体就是自定义导航栏的区域(包括状态栏) 胶囊接口 /*获取菜单按钮(右上角胶囊按钮)的布局位置信息.坐标信息以屏幕左上角为原点 */ wx.getMenuButtonBoundingC ...
- android 自定义标签导航栏,自定义导航栏app下载-自定义导航栏(Custom Navigation Bar) 安卓版v0.4.3-PC6安卓网...
自定义导航栏(Custom Navigation Bar)app是款非常好用的实用工具,自定义导航栏能让你自己设置个性的导航栏,再也不用为单调的导航栏而发愁,独特且唯一,感兴趣的朋友就来下载自定义导航 ...
- 华为 android 菜单键,华为手机怎么设置导航栏?华为手机自定义导航栏教程
华为手机在屏幕下方没有一般安卓机都有的三个实体按键,整个屏幕浑然一体,非常美观.华为手机这几个常用的功能键是在显示屏下方出现的,既可以出现也可以隐藏,非常方便快捷.那么如何设置屏幕下方的导航栏呢? 华 ...
- android 顶部导航栏 自定义,Android自定义NavigationController - 安卓自定义导航栏 --【WJ】...
注意: 本文主要介绍安卓自定义顶部导航栏(iOS中成为NavigationBar):写的不尽如人意的地方,请见谅~ 概述如下: 环境 :Android Studio 1.4 for Mac 语言 :如 ...
- 小程序自定义导航栏(适配不同手机)——拿来就用
基本思路 写自定义导航组件的时候,需要将组件结构一分为二:状态栏 + 标题栏状态栏高度可通过wx.getSystemInfoSync().statusBarHeight获取标题栏高度:安卓:48px, ...
- 小程序自定义导航栏适配
小程序自定义导航栏适配(完美版) 1.发现问题 小程序页面自定义导航栏功能已经开放有些日子了(还不知道这个功能的可以先>>了解一下),这极大的提升了小程序开发的自由度,相信不少小伙伴已经使 ...
最新文章
- Chapter3_操作符_方法调用中的别名问题
- 有点小激动-Index Condition Pushdown Optimization
- win10任务管理器快捷键_win10系统任务管理器怎么打开
- 【蓝桥杯Java_C组·从零开始卷】第六节(一)、Java常用数学函数
- win7如何看计算机用户名和密码怎么办,win7系统电脑查看共享文件夹时不显示用户名和密码输入窗口的解决方法...
- Apple分区总体布局结构
- vue递归组件eventBus策略解决父子组件通讯问题
- STM32F1移植UCOSII
- 小型微型计算机小错误,如何查看IBM小型机系统的错误记录
- 51单片机实现拼音输入法
- 贪吃蛇c语言程序 简书,贪吃蛇游戏(scratch编程)
- 上|中国股市九大伪元宇宙概念股
- 北京地铁,4号线换乘13号线,用时最短换乘线路
- 工具一栏,就是小锤子右边的一排都没亮
- html中怎样写渐变色代码,纯css简单几行代码实现颜色渐变效果 非常漂亮
- matlab张志涌版课后习题答案,matlab教程(张志涌)课后习题答案.doc
- Ruby+Watir安装
- Crash Error Debugging
- 2016 校园招聘求职经历(一)
- 菜鸟在Linux零碎中安置Oracle 11G
热门文章
- JQ的点击按钮变色事件
- 学个Antenna:Matlab天线工具箱知多少(一)
- 京东、百度、华为等大厂发薪日揭秘!看完第一个我就酸了....
- python+django英语单词学习网站vue
- markdown_markdown制作幻灯片ppt的若干方式(marp/slidev)markdow_slidev+vscode
- 短短 146 天就成为 Apache APISIX Committer,我是怎么做到的?
- 贵金属现货白银如何呢?
- 2023手机记事本软件哪个好
- 人工智能之二分类的简单实现
- 字符串模式匹配KMP算法详解(Python语言)