• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

[Swift实际操作]九、完整实例-(7)登录页面:创建自定义视图及相关组件Swift实际操作 ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

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

本文将开始创建登录页面,首先创建该页面所需的一些自定义组件:
做为登录按钮的自定义视图对象。
在【RegLogin】组的名称上点击鼠标右键,打开右键菜单。
【New File】->【Cocoa Touch Class】创建新文件【RegButton.swift】
Name:RegButton
Subclass:ShadowView
Language:Swift

 1 import UIKit
 2 
 3 class RegButton: ShadowView {
 4     //给类添加一个按钮类型的属性
 5     var bt : UIButton!
 6     //首先重写父类的初始化方法
 7     override init(frame: CGRect) {
 8         super.init(frame: frame)
 9         //设置字第个一视图的背景颜色
10         self.backgroundColor = UIColor.white
11         //设置字第个一视图的圆角半径
12         self.cornerRadius = 4.0
13         //设置字第个一视图的投影半径
14         self.shadowRadius = 2.0
15         //设置投影的偏移
16         self.shadowOffset = CGSize(width: 0, height: 1)
17         //设置阴影的颜色
18         self.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 126.0/255)
19         //初始化一个指定显示区域的按钮对象
20         let btFrame = CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height)
21         //设置按钮的字体
22         bt = UIButton(frame: btFrame)
23         bt.titleLabel?.font = UIFont(name: "PingFang SC", size: 14)!
24         //设置按钮在正常状态的标题颜色
25         bt.setTitleColor(.white, for: .normal)
26         //设置按钮在失效状态的标题颜色
27         bt.setTitleColor(UIColor(red: 230.0/255, green: 230.0/255, blue: 230.0/255, alpha: 1.0), for: .disabled)
28         //设置按钮的标题
29         bt.setTitle("", for: .normal)
30         //设置按钮的背景颜色
31         bt.backgroundColor = .clear
32         //将按钮添加到自定义视图中
33         self.addSubview(bt)
34         //调用自定义视图对象的实例方法,
35         //设置当前视图出于失效状态
36         self.deActive()
37     }
38     //添加一个方法,用来设置当前的自定义视图的状态为激活状态,
39     //从而允许用户点击自动定义视图中的按钮对象
40     func active()
41     {
42         //首先使按钮出于正常状态
43         self.bt.isEnabled = true
44         //按钮正常状态下的背景颜色
45         self.backgroundColor = UIColor(red: 255.0/255, green: 89.0/255, blue: 95.0/255, alpha: 1.0)
46         //正常状态下的标题颜色
47         self.bt.titleLabel?.textColor = UIColor.white
48     }
49     //添加一个方法,用来设置当前的自定义视图的状态为激活状态,
50     //从而不允许用户点击自动定义视图中的按钮对象
51     func deActive()
52     {
53         
54         //首先使按钮出于失效状态
55         self.bt.isEnabled = false
56         //按钮失效状态下的背景颜色
57         self.backgroundColor = UIColor.white
58     }
59     //最后添加一个必须实现的初始化方法
60     required init?(coder aDecoder: NSCoder) {
61         fatalError("init(coder:) has not been implemented")
62     }
63 }

接着创建一个针对图像类的扩展。

【New File】->【Swift File】创建新文件【ExtensionUIImage.swift】

接着开始编写代码,完成对图像类的扩展。

 1 import UIKit
 2 //创建一个图像类的扩展
 3 extension UIImage
 4 {
 5     //添加一个扩展方法,该方法被用于修改文本框右侧的删除图标的颜色
 6     func blendColor(_ color: UIColor, blendMode: CGBlendMode) -> UIImage
 7     {
 8         //获得当前图片的显示区域
 9         let rect = CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)
10         //获得当前的图形上下文。
11         //其中第一个参数表示画布的大小
12         //第二个参数表示是否透明图片
13         //第三个参数表示图片的比例
14         UIGraphicsBeginImageContextWithOptions(size, false, scale)
15         //首先将指定的颜色设置为填充色。
16         color.setFill()
17         //然后将填充色填充在指定的区域内。
18         UIRectFill(rect)
19         //最后将指定区域的内容,绘制在当前的图形上下文。
20         draw(in: rect, blendMode: blendMode, alpha: 1.0)
21         //从当前的图形上下文中,获得填充后的图片,并关闭图形上下文。
22         let blendedImage = UIGraphicsGetImageFromCurrentImageContext()
23         UIGraphicsEndImageContext()
24         //最后在方法的末尾,返回图形上下文中获得的图片。
25         return blendedImage!
26     }
27 }

使用键盘上的快捷键【Command】+【N】,继续创建一个类文件。

接着创建一个针对图像类的扩展。

【New File】->【Cocoa Touch Class】创建新文件【UserInfo.swift】

Name:UserInfo
Subclass:NSObjecct
Language:Swift

该类将用来在本地存储用户信息

  1 import UIKit
  2 import Foundation
  3 //使类遵循编码协议,它可以将类的实例转化为序列化的数据进行存储。
  4 class UserInfo : NSObject, NSCoding {
  5     //添加属性:表示用户的考试类型
  6     var myKeMu : PaperType = .ACT
  7     //添加属性:用户是否为海外用户
  8     var isHaiWai : Bool = false
  9     //手机号码
 10     var phone : String = ""
 11     //邮箱
 12     var email : String = ""
 13     //密码
 14     var password : String = ""
 15     //昵称
 16     var nickname : String = ""
 17     //验证码
 18     var verifyCode : String = ""
 19     //头像图片
 20     var avatar : UIImage = UIImage()
 21     //是否参加过考试
 22     var isTested : Bool = false
 23     //头像路径
 24     var head_img : String = ""
 25     //年级
 26     var grade : Int = 1
 27     //生日
 28     var birthday = ""
 29     //用户的唯一标志符
 30     var id = 0
 31     //性别
 32     var sex = 0
 33     //老师
 34     var teacher = ""
 35     //用户考试类型
 36     var exam_type = 0
 37     //状态
 38     var status = 0
 39     //当前总考分
 40     var current_score : Int = 0     //相当于服务器中的current_score
 41     //英语
 42     var english : Int = 0           //相当于服务器中的english
 43     //数学
 44     var math : Int = 0              //相当于服务器中的math
 45     //阅读
 46     var reading : Int = 0           //相当于服务器中的reading
 47     //科学
 48     var science : Int = 0           //相当于服务器中的science
 49     //写作
 50     var writing : Int = 0           //相当于服务器中的writing
 51     
 52     var expect_english : Int = 0
 53     var expect_reading : Int = 0
 54     var expect_science : Int = 0
 55     var expect_score : Int = 0
 56     var expect_writing : Int = 0
 57     var expect_math : Int = 0
 58     
 59     //实现协议中的方法
 60     //用来将用户信息进行编码
 61     func encode(with aCoder: NSCoder)
 62     {
 63         //首先对用户的手机、邮箱、密码、昵称、和是否参考过考试等属性进行编码
 64         //并设置对应的键名
 65         aCoder.encode(self.phone, forKey: "phone")
 66         aCoder.encode(self.email, forKey: "email")
 67         aCoder.encode(self.password, forKey: "password")
 68         aCoder.encode(self.nickname, forKey: "nickname")
 69         aCoder.encode(self.isTested, forKey: "isTested")
 70         //接着对另外八个属性进行编码
 71         aCoder.encode(self.head_img, forKey: "head_img")
 72         aCoder.encode(self.grade, forKey: "grade")
 73         aCoder.encode(self.birthday, forKey: "birthday")
 74         aCoder.encode(self.id, forKey: "id")
 75         aCoder.encode(self.sex, forKey: "sex")
 76         aCoder.encode(self.teacher, forKey: "teacher")
 77         aCoder.encode(self.exam_type, forKey: "exam_type")
 78         aCoder.encode(self.status, forKey: "status")
 79         //最后对剩余的六个属性进行编码
 80         aCoder.encode(self.current_score, forKey: "current_score")
 81         aCoder.encode(self.english, forKey: "english")
 82         aCoder.encode(self.math, forKey: "math")
 83         aCoder.encode(self.reading, forKey: "reading")
 84         aCoder.encode(self.science, forKey: "science")
 85         aCoder.encode(self.writing, forKey: "writing")
 86         
 87         aCoder.encode(self.expect_english, forKey: "expect_english")
 88         aCoder.encode(self.expect_reading, forKey: "expect_reading")
 89         aCoder.encode(self.expect_science, forKey: "expect_science")
 90         aCoder.encode(self.expect_score, forKey: "expect_score")
 91         aCoder.encode(self.expect_writing, forKey: "expect_writing")
 92         aCoder.encode(self.expect_math, forKey: "expect_math")
 93     }
 94     //实现协议中的方法,用来将将过编码的用户信息进行解码
 95     required init(coder aDecoder: NSCoder)
 96     {
 97         super.init()
 98         //首先对用户的手机、邮箱、密码、昵称、和是否参考过考试等属性进行解码
 99         self.phone = aDecoder.decodeObject(forKey: "phone") as! String
100         self.email = aDecoder.decodeObject(forKey: "email") as! String
101         self.password = aDecoder.decodeObject(forKey: "password") as! String
102         self.nickname = aDecoder.decodeObject(forKey: "nickname") as! String
103         self.nickname = aDecoder.decodeObject(forKey: "nickname") as! String
104          //接着对另外八个属性进行解码
105         self.head_img = aDecoder.decodeObject(forKey: "head_img") as! String
106         self.grade = aDecoder.decodeInteger(forKey: "grade")
107         self.birthday = aDecoder.decodeObject(forKey: "birthday") as! String
108         self.id = aDecoder.decodeInteger(forKey: "id")
109         self.sex = aDecoder.decodeInteger(forKey: "sex")
110         self.teacher = aDecoder.decodeObject(forKey: "teacher") as! String
111         self.exam_type = aDecoder.decodeInteger(forKey: "exam_type")
112         self.status = aDecoder.decodeInteger(forKey: "status")
113         //然后对剩余的六个属性进行解码
114         self.current_score = aDecoder.decodeInteger(forKey: "current_score")
115         self.english = aDecoder.decodeInteger(forKey: "english")
116         self.math = aDecoder.decodeInteger(forKey: "math")
117         self.reading = aDecoder.decodeInteger(forKey: "reading")
118         self.science = aDecoder.decodeInteger(forKey: "science")
119         self.writing = aDecoder.decodeInteger(forKey: "writing")
120         
121         self.expect_english = aDecoder.decodeInteger(forKey: "expect_english")
122         self.expect_reading = aDecoder.decodeInteger(forKey: "expect_reading")
123         self.expect_science = aDecoder.decodeInteger(forKey: "expect_science")
124         self.expect_score = aDecoder.decodeInteger(forKey: "expect_score")
125         self.expect_writing = aDecoder.decodeInteger(forKey: "expect_writing")
126         self.expect_math = aDecoder.decodeInteger(forKey: "expect_math")
127         
128         
129     }
130     //最后添加一个初始化方法,完成用户信息类的创建
131     override init()
132     {
133         
134     }
135     
136     func setScore(num:Int, score:Int)
137     {
138         switch num {
139             case 0:
140                 self.current_score = score
141             case 1:
142                 self.english = score
143             case 2:
144                 self.math = score
145             case 3:
146                 self.reading = score
147             case 4:
148                 self.science = score
149             default: break
150             
151         }
152     }
153     
154     func setSATScore(num:Int, score:Int)
155     {
156         switch num {
157         case 0:
158             self.reading = score
159         case 1:
160             self.math = score
161         case 2:
162             self.writing = score
163         default: break
164             
165         }
166     }
167 }

使用键盘上的快捷键【Command】+【N】,继续创建一个类文件。

【New File】->【Swift File】创建新文件【DataUtil.swift】

接着开始编写代码,完成对图像类的扩展。

  1 import Foundation
  2 import UIKit
  3 import Alamofire
  4 import Toaster
  5 import PKHUD
  6 import Qiniu
  7 
  8 class DataUtil
  9 {
 10     class func hasLogined() -> Bool
 11     {
 12         return UserDefaults.standard.bool(forKey: "hasLogin")
 13     }
 14     class func setLogined()
 15     {
 16         UserDefaults.standard.set(true, forKey: "hasLogin")
 17         UserDefaults.standard.synchronize()
 18     }
 19     class func setLoginOut()
 20     {
 21         UserDefaults.standard.set(false, forKey: "hasLogin")
 22         UserDefaults.standard.synchronize()
 23     }
 24     
 25     class func hasShowIntro() -> Bool
 26     {
 27         return UserDefaults.standard.bool(forKey: "hasShowIntro")
 28     }
 29     class func setShowInfo()
 30     {
 31         UserDefaults.standard.set(true, forKey: "hasShowIntro")
 32         UserDefaults.standard.synchronize()
 33     }
 34     
 35     class func getTabBarHeight(vc:UIViewController) -> CGFloat
 36     {
 37         return (vc.tabBarController?.tabBar.frame.size.height)!
 38     }
 39     
 40     class func setCrtUser(userInfo : UserInfo)
 41     {
 42         let data = NSMutableData()
 43         let archive = NSKeyedArchiver(forWritingWith: data)
 44         archive.encode(userInfo, forKey: "crtUserInfo")
 45         archive.finishEncoding()
 46         
 47         let filePath = NSHomeDirectory() + "/Documents/crtUserInfo.data"
 48         data.write(toFile: filePath, atomically: true)
 49     }
 50     //添加一个类方法,用来获得归档的用户信息
 51     class func getCrtUser() -> UserInfo
 52     {
 53         //首先获得用户归档文件的存储路径
 54         let filePath = NSHomeDirectory() + "/Documents/crtUserInfo.data"
 55         //然后加载该路径下的文件,并初始化一个键值解码器
 56         let fileData = NSMutableData(contentsOfFile: filePath)
 57         let unarchiver = NSKeyedUnarchiver(forReadingWith: fileData! as Data)
 58         //根据键名,对指定的归档进行解码
 59         let savedUser = unarchiver.decodeObject(forKey: "crtUserInfo") as! UserInfo
 60         unarchiver.finishDecoding()
 61         //最后返回解码后的用户信息对象
 62         return savedUser
 63     }
 64     //接着添加一个类方法,用来设置用户使用游客身份访问应用程序
 65     class func setVisitorLogin(value:Bool)
 66     {
 67         UserDefaults.standard.set(value, forKey: "IsVisitorLogin")
 68         UserDefaults.standard.synchronize()
 69     }
 70     //添加一个类方法,用来判断用户是否为游客身份
 71     class func isVisitorLogin() -> Bool
 72     {
 73         return UserDefaults.standard.bool(forKey: "IsVisitorLogin"
                      

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[Swift]LeetCode1110.删点成林|DeleteNodesAndReturnForest发布时间:2022-07-13
下一篇:
swift常用第三方库发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap