1. 程式人生 > >[Swift4.2實際操作]九、完整例項-(5)建立BaseViewController作為控制器的基類

[Swift4.2實際操作]九、完整例項-(5)建立BaseViewController作為控制器的基類

本文將給專案中的所有檢視控制器,建立一份基類。該基類用來定義一些共用的屬性和方法。

首先在用來放置檢視控制器類的資料夾上點選滑鼠右鍵,開啟右鍵 選單。

選擇【New File】建立檔案選項。

在彈出的檔案模板選擇視窗中,保持預設的選項,

然後點選【Next】下一步按鈕,進入下一步設定頁面。輸入類名、父類、語言

【Class】:BaseViewController
【Subclass】:UIViewController
【Language】:Swift

然後點選【Next】下一步按鈕,進入下一步設定頁面。

選擇檔案儲存位置,點選【Create】按鈕,完成檔案的建立。

  1 import UIKit
2 //首先新增一個列舉型別,包含兩個成員:解析和答案。 3 enum TabType : Int { 4 case Analysis = 1 5 case Answer = 2 6 } 7 8 //新增另一個列舉型別,該列舉包含兩個成員: 9 //美國大學入學考試和由美國大學委員會主辦的學術能力評估測試 10 enum PaperType : Int{ 11 case ACT = 1 12 case SAT = 2 13 } 14 15 class BaseViewController: UIViewController {
16 //新增一個字串常量,作為專案中所有伺服器請求地址的開頭部分。 17 let baseUrl = "https://www.cnblogs.com/strengthen/" 18 //新增按鈕物件:作為頁面左上角的後退按鈕 19 var backBt : UIButton! 20 //新增按鈕物件:作為頁面左上角的關閉 21 var dismissBt : UIButton! 22 //新增顏色物件,作為所有頁面中的文字的深灰色 23 let fontColorDarkGray = UIColor(red: 74.0/255
, green: 74.0/255, blue: 74.0/255, alpha: 1.0) 24 //新增顏色物件,作為所有頁面中的文字的淺灰色 25 let fontColorLightGray = UIColor(red: 229.0/255, green: 229.0/255, blue: 229.0/255, alpha: 1.0) 26 //新增顏色物件,作為文字的紅色 27 let fontColorRed = UIColor(red: 255.0/255, green: 89.0/255, blue: 95.0/255, alpha: 1.0) 28 //新增顏色物件,作為文字的綠色 29 let fontColorGreen = UIColor(red: 0.0/255, green: 126.0/255, blue: 125.0/255, alpha: 1.0) 30 //新增顏色物件,作為文字的藍色 31 let fontColorBlue = UIColor(red: 74.0/255, green: 144.0/255, blue: 226.0/255, alpha: 1.0) 32 //新增顏色物件,作為分割線的顏色 33 let fontColorSplit = UIColor(red: 230.0/255, green: 230.0/255, blue: 230.0/255, alpha: 0.5) 34 //新增四個字型物件,作為正文、標題等專案的文字大小 35 let fontName : String = "PingFang SC" 36 let font14 : UIFont = UIFont(name: "PingFang SC", size: 14)! 37 let font17 : UIFont = UIFont(name: "PingFang SC", size: 17)! 38 let font20 : UIFont = UIFont(name: "PingFang SC", size: 20)! 39 let font24 : UIFont = UIFont(name: "PingFang SC", size: 24)! 40 //新增四個變數 41 //作為標籤、文字框等元件的寬度、高度的基準數值 42 var width40 : Int = 0 43 var widthFull : Int = 0 44 var heightFull : Int = 0 45 var startPoint : CGPoint! 46 47 override func viewDidLoad() { 48 super.viewDidLoad() 49 //由於頁面的底色比較深。所以設定狀態列的風格為亮色, 50 //同時隱藏導航控制器的後退按鈕。 51 UIApplication.shared.statusBarStyle = UIStatusBarStyle.lightContent 52 //隱藏導航控制器的控制按鈕 53 self.navigationItem.hidesBackButton = true 54 55 // Do any additional setup after loading the view. 56 //對元件常見的高度和寬度進行初始化 57 self.width40 = Int(self.view.frame.size.width) - 40 58 self.heightFull = Int(self.view.frame.size.height) 59 self.widthFull = Int(self.view.frame.size.width) 60 //應用程式的所有頁面都使用相同漸變型別的背景顏色,在基類中建立背景顏色。 61 //這樣所有繼承自該基類的檢視控制器,也都自動具有相同的背景。 62 let gradientLayer = CAGradientLayer() 63 64 gradientLayer.bounds = CGRect(x: 0, y: 0, width: self.widthFull+1, height: self.heightFull+1) 65 //設定漸變層的位置和漸變的起始顏色、中間顏色和結束顏色 66 gradientLayer.position = CGPoint(x: self.widthFull/2, y: self.heightFull/2) 67 gradientLayer.colors = [UIColor(red: 48.0/255, green: 35.0/255, blue: 174.0/255, alpha: 1.0).cgColor, UIColor(red: 126.0/255, green: 67.0/255, blue: 170.0/255, alpha: 1.0).cgColor] 68 //設定漸變層的起始點和結束點,從而建立一個45度方向的漸變背景層 69 gradientLayer.startPoint = CGPoint(x: 1, y: 1) 70 gradientLayer.endPoint = CGPoint(x: 0, y: 0) 71 self.view.layer.insertSublayer(gradientLayer, at: 0) 72 //對所有頁面共有的後退按鈕進行初始化,並設定它的圖片樣式。 73 backBt = UIButton(frame: CGRect(x: 11, y: 26, width: 33, height: 33)) 74 backBt.setImage(UIImage(named:"LeftArrow"), for: .normal) 75 //給按鈕物件新增繫結事件 76 backBt.addTarget(self, action: #selector(BaseViewController.backBtTapped(_:)), for: .touchUpInside) 77 //並新增到根檢視中。 78 self.view.addSubview(backBt) 79 //接著對關閉按鈕進行初始化,並設定它的圖片樣式 80 dismissBt = UIButton(frame: CGRect(x: 13, y: 20, width: 40, height: 40)) 81 dismissBt.setImage(UIImage(named:"iconCloseBlack"), for: .normal) 82 //給按鈕物件繫結點選事件 83 dismissBt.addTarget(self, action: #selector(BaseViewController.dismissBtTapped(_:)), for: .touchUpInside) 84 //預設狀態處於隱藏狀態 85 dismissBt.isHidden = true 86 //新增到根檢視中 87 self.view.addSubview(dismissBt) 88 } 89 90 //新增一個方法,用來響應後退按鈕的點選事件。當按鈕被點選時,使導航控制器返回上一個頁面。 91 //MARK: - 92 //MARK: back 93 94 @objc func backBtTapped(_ sender:UIButton) 95 { 96 self.navigationController?.popViewController(animated: true) 97 } 98 99 //新增一個方法,用來響應關閉按鈕的點選事件。當按鈕被點選時,關閉彈出的視窗。 100 //MARK: cancel 101 @objc func dismissBtTapped(_ sender:UIButton) 102 { 103 self.dismiss(animated: true, completion: nil) 104 } 105 106 //新增一個方法,用來獲得鍵盤的高度。 107 //MARK: KeyboardHeight 108 func getKeyboardHeight() -> Int 109 { 110 //首先獲得鍵盤的輸入模式 111 let lang = UITextInputMode.activeInputModes[0] 112 let primaryLanguage = lang.primaryLanguage 113 //判斷當鍵盤的語言為英文時,返回指定的鍵盤高度。 114 if(primaryLanguage == "en-US") 115 { 116 return 253 117 } 118 //判斷當鍵盤的語言是中國大陸簡體中文時,根據螢幕是否為Plus螢幕,返回不同的鍵盤高度。 119 else if(primaryLanguage == "zh-CN") 120 { 121 if(self.view.frame.size.width == 414) 122 { 123 return 256+40 124 } 125 else 126 { 127 return 256 128 } 129 } 130 //判斷當鍵盤的語言是通用簡體中文時,根據螢幕是否為Plus螢幕,返回不同的鍵盤高度。 131 else if(primaryLanguage == "zh-Hans") 132 { 133 if(self.view.frame.size.width == 414) 134 { 135 return 216+40 136 } 137 else 138 { 139 return 216 140 } 141 142 } 143 //最後返回當鍵盤資料表情鍵盤或預設狀態下的高度 144 else if(primaryLanguage == "emoji") 145 { 146 return 216 147 } 148 149 return 253 150 } 151 152 //接著實現手指在螢幕上由右向左滑動時,使導航控制器返回上一頁的功能。 153 //首先重寫檢視控制器的手指按下的事件 154 //MARK: - 155 //MARK: touchesBegan 156 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) 157 { 158 //獲得觸控手勢的第一個觸控點,在當前檢視中的座標 159 let touch = touches.first 160 startPoint = touch?.location(in: self.view) 161 } 162 163 //重寫手指滑動時的事件 164 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 165 { 166 ///獲得觸控手勢的第一個觸控點的座標 167 let touch = touches.first 168 let touchPoint = touch?.location(in: self.view) 169 //獲得當前點的座標和剛開始手指按下時的座標的水平距離和垂直距離。 170 let disX = (touchPoint?.x)! - (startPoint?.x)! 171 let disY = abs((touchPoint?.y)! - (startPoint?.y)!) 172 //處理當手指在水平方向上,從右向左滑動大於50點的情況 173 if(disY < 10 && disX > 50) 174 { 175 //假如當前的檢視控制器處於導航控制器的內部,則使導航控制器返回上一個頁面。 176 if(self.navigationController != nil) 177 { 178 startPoint = CGPoint(x: 0, y: 0) 179 self.navigationController?.popViewController(animated: true) 180 } 181 } 182 } 183 184 //重寫手勢的結束事件,恢復起點的座標 185 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) 186 { 187 startPoint = CGPoint(x: 0, y: 0) 188 } 189 190 //最後重寫手勢的取消事件,同樣恢復起點的座標。 191 override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) 192 { 193 startPoint = CGPoint(x: 0, y: 0) 194 } 195 196 //新增一個方法,用來隱藏標籤控制器底部的標籤 197 func hideTabBar() 198 { 199 self.tabBarController?.tabBar.isHidden = true 200 } 201 202 //新增一個方法,用來顯示籤控制器底部的標籤 203 func showTabBar() 204 { 205 self.tabBarController?.tabBar.isHidden = false 206 } 207 208 //接著開啟專案控制器的類檔案ViewController.swift 209 override func didReceiveMemoryWarning() { 210 super.didReceiveMemoryWarning() 211 // Dispose of any resources that can be recreated. 212 } 213 }

將檢視控制器的父類UIViewController,修改為建立的基類BaseViewController

 1 import UIKit
 2 //記得將父類的名稱UIViewController修改為BaseViewController
 3 class ViewController: BaseViewController {
 4 
 5     override func viewDidLoad() {
 6         super.viewDidLoad()
 7         
 8     }
 9     
10     override func didReceiveMemoryWarning() {
11         super.didReceiveMemoryWarning()
12         // Dispose of any resources that can be recreated.
13     }
14 }