[Swift实际操作]九、完整实例,5创建BaseViewController作为控制器的基类

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

本文将给项目中的所有视图控制器,创建一份基类。该基类用来定义一些共用的属性和方法。

首先在用来放置视图控制器类的文件夹上点击鼠标右键,打开右键 菜单。

选择【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 }