首页导航栏设置

重点掌握内容

  • 导航栏添加Items
  • 给系统的类扩充方法
  • 扩充便利构造函数

效果展示

  • 在iOS开发中,导航栏的设置是必不可少的一部分。
  • 通常导航栏中会放很多的UIBarButtonItem,以方便用于操作对应的功能
  • 斗鱼首页导航条展示

直接实现(最low方式)

  • 不管是左侧logo的Item,还是右侧的三个Item都是有点击效果的。
  • 因此在实现时,最好创建UIButton,通过给UIButton设置图片来实现。并且让UIButton作为UIBarButtonItem的customView
  • 实现代码如下:
 
  1. // MARK:- 设置导航栏内容
  2. extension HomeViewController {
  3. // MARK: 设置导航栏
  4. private func setupNavigationBar() {
  5. setupNavigationLeftBar()
  6. setupNavigationRightBar()
  7. }
  8. private func setupNavigationLeftBar() {
  9. let btn = UIButton()
  10. btn.setImage(UIImage(named: "logo"), forState: .Normal)
  11. btn.sizeToFit()
  12. btn.addTarget(self, action: #selector(self.leftItemClick), forControlEvents: .TouchUpInside)
  13. navigationItem.leftBarButtonItem = UIBarButtonItem(customView: btn)
  14. }
  15. private func setupNavigationRightBar() {
  16. // 1.确定UIButton的尺寸
  17. let size = CGSize(width: 40, height: 44)
  18. // 2.创建历史的Item
  19. let historyBtn = UIButton()
  20. historyBtn.setImage(UIImage(named: "image_my_history"), forState: .Normal)
  21. historyBtn.setImage(UIImage(named: "image_my_history_click"), forState: .Highlighted)
  22. historyBtn.addTarget(self, action: #selector(self.historyItemClick), forControlEvents: .TouchUpInside)
  23. historyBtn.frame = CGRect(origin: CGPointZero, size: size)
  24. let historyItem = UIBarButtonItem(customView: historyBtn)
  25. // 3.创建搜索的Item
  26. let searchBtn = UIButton()
  27. searchBtn.setImage(UIImage(named: "btn_search"), forState: .Normal)
  28. searchBtn.setImage(UIImage(named: "btn_search_clicked"), forState: .Highlighted)
  29. searchBtn.addTarget(self, action: #selector(self.searchItemClick), forControlEvents: .TouchUpInside)
  30. searchBtn.frame = CGRect(origin: CGPointZero, size: size)
  31. let searchItem = UIBarButtonItem(customView: searchBtn)
  32. // 4.创建二维码的Item
  33. let qrcodeBtn = UIButton()
  34. qrcodeBtn.setImage(UIImage(named: "image_scan"), forState: .Normal)
  35. qrcodeBtn.setImage(UIImage(named: "image_scan_click"), forState: .Highlighted)
  36. qrcodeBtn.addTarget(self, action: #selector(self.qrCodeItemClick), forControlEvents: .TouchUpInside)
  37. qrcodeBtn.frame = CGRect(origin: CGPointZero, size: size)
  38. let qrcodeItem = UIBarButtonItem(customView: qrcodeBtn)
  39. navigationItem.rightBarButtonItems = [historyItem, searchItem , qrcodeItem]
  40. }
  41. // MARK: 导航栏的事件处理
  42. @objc private func leftItemClick() {
  43. print("点击了logo")
  44. }
  45. @objc private func qrCodeItemClick() {
  46. print("点击了二维码")
  47. }
  48. @objc private func searchItemClick() {
  49. print("点击了搜索")
  50. }
  51. @objc private func historyItemClick() {
  52. print("点击了历史")
  53. }
  54. }

优化上述代码(系统类扩充方法)

  • 上述方式虽然实现了功能,但是我们发现重复代码太多。
  • 并且如果其他地方也用到类似的功能,还是要写大量代码。
  • 最好的方式就是进行抽取?
  • 如何抽取呢?
    • 在OC中我们通常给系统的类抽取分类,在分类中给系统的类扩充方法
    • Swift也是类似,只是Swift使用extension,表示对系统的类进行扩充
  • 比如我们给系统的类抽取类方法,代码如下:
  • 给系统类扩充类方法
 
  1. extension UIBarButtonItem {
  2. class func createBarButtonItem(imageName : String, highImageName : String = "", size : CGSize = CGSizeZero, target : AnyObject? = nil, action : Selector = nil) -> UIBarButtonItem {
  3. // 1.创建UIButton
  4. let btn = UIButton(type: .Custom)
  5. // 2.给UIButton设置属性
  6. btn.setImage(UIImage(named: imageName), forState: .Normal)
  7. if highImageName != "" {
  8. btn.setImage(UIImage(named: highImageName), forState: .Highlighted)
  9. }
  10. // 3.设置尺寸
  11. if size == CGSizeZero {
  12. btn.sizeToFit()
  13. } else {
  14. btn.frame = CGRect(origin: CGPointZero, size: size)
  15. }
  16. // 4.监听点击
  17. btn.addTarget(target, action: action, forControlEvents: .TouchUpInside)
  18. return UIBarButtonItem(customView: btn)
  19. }
  20. }
  • 使用方式:
 
  1. // MARK: 设置导航栏
  2. private func setupNavigationBar() {
  3. setupNavigationLeftBar()
  4. setupNavigationRightBar()
  5. }
  6. private func setupNavigationLeftBar() {
  7. navigationItem.leftBarButtonItem = UIBarButtonItem.createBarButtonItem("logo", target: self, action: #selector(self.leftItemClick))
  8. }
  9. private func setupNavigationRightBar() {
  10. let size = CGSize(width: 40, height: 44)
  11. let historyItem = UIBarButtonItem.createBarButtonItem("image_my_history", highImageName: "image_my_history_click", size: size, target: self, action: #selector(self.historyItemClick))
  12. let searchItem = UIBarButtonItem.createBarButtonItem("btn_search", highImageName: "btn_search_click", size: size, target: self, action: #selector(self.searchItemClick))
  13. let qrCodeItem = UIBarButtonItem.createBarButtonItem("image_scan", highImageName: "image_scan_click", size: size, target: self, action: #selector(self.qrCodeItemClick))
  14. navigationItem.rightBarButtonItems = [historyItem, searchItem , qrCodeItem]
  15. }

扩充遍历构造函数(推荐做法)

  • 遍历构造函数特点

    • 构造函数前以convenience开头
    • 必须明确调用设计构造函数:例如self.init()
  • 构造函数写法:
 
  1. extension UIBarButtonItem {
  2. convenience init(imageName : String, highImageName : String = "", size : CGSize = CGSizeZero, target : AnyObject? = nil, action : Selector = nil) {
  3. let btn = UIButton(type: .Custom)
  4. btn.setImage(UIImage(named: imageName), forState: .Normal)
  5. if highImageName != "" {
  6. btn.setImage(UIImage(named: highImageName), forState: .Highlighted)
  7. }
  8. if size == CGSizeZero {
  9. btn.sizeToFit()
  10. } else {
  11. btn.frame = CGRect(origin: CGPointZero, size: size)
  12. }
  13. btn.addTarget(target, action: action, forControlEvents: .TouchUpInside)
  14. self.init(customView: btn)
  15. }
  16. }
  • 使用方式:
 
  1. // MARK: 设置导航栏
  2. private func setupNavigationBar() {
  3. setupNavigationLeftBar()
  4. setupNavigationRightBar()
  5. }
  6. private func setupNavigationLeftBar() {
  7. navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "logo", target: self, action: #selector(self.leftItemClick))
  8. }
  9. private func setupNavigationRightBar() {
  10. let size = CGSize(width: 40, height: 44)
  11. let historyItem = UIBarButtonItem(imageName: "image_my_history", highImageName: "image_my_history_click", size: size, target: self, action: #selector(self.historyItemClick))
  12. let searchItem = UIBarButtonItem(imageName: "btn_search", highImageName: "btn_search_click", size: size, target: self, action: #selector(self.searchItemClick))
  13. let qrCodeItem = UIBarButtonItem(imageName: "image_scan", highImageName: "image_scan_click", size: size, target: self, action: #selector(self.qrCodeItemClick))
  14. navigationItem.rightBarButtonItems = [historyItem, searchItem , qrCodeItem]
  15. }

小码哥-玩转【斗鱼直播APP】系列之首页导航栏设置相关推荐

  1. 玩转【斗鱼直播APP】系列之首页导航栏设置

    首页导航栏设置 重点掌握内容 导航栏添加Items 给系统的类扩充方法 扩充便利构造函数 效果展示 在iOS开发中,导航栏的设置是必不可少的一部分. 通常导航栏中会放很多的UIBarButtonIte ...

  2. 小码哥-玩转【斗鱼直播APP】系列之项目部署

    项目部署目的 任何一个项目最好使用源代码管理工具 源代码管理工具可以帮助我们解决备份.版本回退等等问题 因为是非基础篇,因此具体好处不在累述 常见的源代码管理工具: SVN: 集中式源代码管理工具 G ...

  3. 小码哥-玩转【斗鱼直播APP】系列之获取APP图片资源

    重要提醒 原作者的代码有少许问题, 可能会崩溃 我已经在我fork的代码中修复了问题. 请大家去我的Github上下载该工具. 如果对你有帮助, 可以star一下哈. Github地址: coderw ...

  4. 小码哥-玩转【斗鱼直播APP】系列之利用青花瓷抓取数据

    利用青花瓷抓取数据 青花瓷是什么? 当然这里可不是周董的歌曲, 而是我们用于抓取接口的工具. 安装一下这个软件 百度搜索该工具会找到很多绿色版(破解版的文艺说法). 安装即可, 不再累述. 手机端配置 ...

  5. 小码哥-玩转【斗鱼直播APP】系列之实现无限轮播

    实现无限轮播 生活杂谈 最近很多童鞋私信我,Swift项目有些语法跟不上.希望我出OC版的(OC版我会在后续推出),但是以我的考虑来说,Swift在语言排行版上面其实已经超过OC,另外国内现在新项目一 ...

  6. 小码哥-玩转【斗鱼直播APP】系列之框架搭建

    搭建效果展示 框架搭建分析 首先最底部是一个UITabbar,因此我们可以用一个UITabBarController作为启动控制器 分别添加子控制器HomeVc.LiveVc.FollowVc.Pro ...

  7. 小码哥-玩转【斗鱼直播APP】系列之首页布局分析实现

    本帖最后由 王红元老师 于 2016-9-14 21:25 编辑 布局首页分析实现 完成最终效果 这个效果还是挺常见的哈 效果分析: 顶部是一个工具类,并且为了该工具类可以复用.(其他界面也用到)最好 ...

  8. 小码哥-玩转【斗鱼直播APP】系列之布局推荐界面

    布局推荐界面 实现效果 今天内容完成效果 推荐界面分析 上层有无限轮播器(之后再完成) 滚动的UIScrollView或者UICollectionView(之后再完成) 下面是UICollection ...

  9. 小码哥-玩转【斗鱼直播APP】系列之项目基本设置

    设置的内容 任何一个项目在新建之后都有很多东西需要进行设置. 比如版本号.BundleID.部署版本等等 设置BundleID.部署版本.横竖屏等 设置图标.启动图片 设置项目名称 Info.plis ...

最新文章

  1. mSystem:西农韦革宏组细菌-真菌互作影响微生物多样性-土壤养分循环关系
  2. 基于springboot实现疫情管理系统
  3. go语言之行--基础部分
  4. apollo芯片_ADAS/AD主控芯片研究:集成趋势下的短板与变革
  5. 遭遇内存无法读写的错误
  6. volatile关键字——保证并发编程中的可见性、有序性
  7. Android vlc 分析视频,VLC-Android 对视频流(RTSP)做翻转、旋转
  8. SpringCloud工作笔记050---关于同一账号多人同时登录的token重复问题
  9. 不缺流量却变现乏力?穿山甲重磅打造《App 如何变现创收》系列课程帮你找症结...
  10. IoT:MQTT协议详解
  11. 东芝如何看待蓝牙在物联网热潮下的机遇
  12. Java5的倍数_关于java:将数字四舍五入到最接近的5的倍数
  13. sem竞价账户怎么提升效果提高转化
  14. 大家都在努力,你凭什么不努力?
  15. 表格分组标签:表格行分组中的隐藏功能
  16. win10安装虚拟机Linux Centos7系统网络配置
  17. Java基础之IO流(三)
  18. 网络中常说的“丢包”是什么?—Vecloud微云
  19. 2020.6月做题记录
  20. 电销机器人来了,企业的业绩上来了吗?

热门文章

  1. 一文读懂UWB超宽带技术
  2. 饼图、柱形图、堆积柱、折线图、散点图,到底应该怎么选?
  3. 解压.tar.gz文件
  4. 苹果 iPhone 4 手机拆机组图,看看 iPhone 4 的内部构造与零件(二)_打杂的_新浪博客...
  5. Java Tomcat 以及Eclipse显示三只小猫咪图标
  6. 三年级计算机帮助我们学本领,三年级学本领作文
  7. 硅谷的由来—(计算机基础课七)
  8. Java 之Spring面试题
  9. 理解ES的refresh、flush、merge
  10. centos7 设置阿里云yum源、docker源和docker镜像加速