小碼哥-玩轉【鬥魚直播APP】系列之首頁導航欄設置

首頁導航欄設置

重點掌握內容

  • 導航欄添加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. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章