[Swift实际操作]九、完整实例-(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 }