1. import UIKit
  2. /*
  3. * 注册协议view:没找到 UI原图,咱不实现
  4. */
  5. class JYRegisterProtocolView: UIView {
  6.  
  7. /// 点击同意协议的回调
  8. private var clickSelectedBtnBlock:((_ isSelected:Bool) -> Void)?
  9. /// 点击完成按钮的回调
  10. private var clickCompleteBtnBlock:(() -> Void)?
  11.  
  12. /// 单例属性
  13. static let share : JYRegisterProtocolView = {
  14. let view = JYRegisterProtocolView()
  15. return view
  16. }()
  17.  
  18. /// 背景view
  19. private lazy var bgView : UIView = {
  20. let v = JYUIModel.createView()
  21. v.layer.cornerRadius = 25
  22. v.layer.masksToBounds = true
  23. return v
  24. }()
  25.  
  26. /// 注册协议标题
  27. private lazy var titleLabel : UILabel = JYUIModel.creatLabe(text: "注册协议", font: UIFont.systemFont(ofSize: 30), textColor: UIColor.red, textAlignment: NSTextAlignment.center)
  28.  
  29. /// 副标题标题
  30. private lazy var subtitleLabel : UILabel = {
  31. let lab = JYUIModel.creatLabe(text: "疯抢进10万元现金,等你来拿!\n\n参赛资格:剑琅联盟使用用户中:\n1.店铺老板 \n2.店铺发型师 \n3.店铺美甲师 \n活动有效期:2019.1.1~2019.3.31\n \n活动共五期 没齐活动奖励:\n第一名8000元(推荐员工奖励5000元现金,所在店铺老板奖励3000元现金)\n第二名 3000元 \n第三名 2000元", font: UIFont.systemFont(ofSize: 15), textColor: UIColor.red, textAlignment: NSTextAlignment.left)
  32. lab.numberOfLines = 0
  33. return lab
  34. }()
  35.  
  36. /// 选择按钮
  37. private lazy var selectedBtn : UIButton = {
  38. let btn = JYUIModel.createBtn()
  39. btn.addTarget(self, action: #selector(clickSelectedBtn), for: UIControl.Event.touchUpInside)
  40. btn.backgroundColor = UIColor.orange
  41.  
  42. return btn
  43. }()
  44.  
  45. /// 同意文字标题
  46. private lazy var agreeLabel : UILabel = JYUIModel.creatLabe(text: "我已认真阅读并同意", font: UIFont.systemFont(ofSize: 16), textColor: UIColor.red, textAlignment: NSTextAlignment.center)
  47.  
  48. /// 完成按钮
  49. private lazy var completeBtn : UIButton = {
  50. let btn = JYUIModel.createBtn()
  51. btn.titleLabel?.font = UIFont.systemFont(ofSize: 30)
  52. btn.layer.cornerRadius = 25
  53. btn.layer.masksToBounds = true
  54. btn.backgroundColor = UIColor.purple
  55. btn.setTitle("完成注册", for: UIControl.State.normal)
  56. btn.setTitleColor(UIColor.red, for: UIControl.State.normal)
  57. btn.setTitle("完成注册", for: UIControl.State.selected)
  58. btn.setTitleColor(UIColor.green, for: UIControl.State.selected)
  59. btn.addTarget(self, action: #selector(clickcompleteBtn), for: UIControl.Event.touchUpInside)
  60. return btn
  61. }()
  62.  
  63. override init(frame: CGRect) {
  64. super.init(frame: frame)
  65. configUI()
  66. }
  67.  
  68. required init?(coder aDecoder: NSCoder) {
  69. fatalError("init(coder:) has not been implemented")
  70. }
  71.  
  72. //点击背景view 移除当前控件
  73. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  74. if let touch = touches.first {
  75. var point = touch.location(in: self)
  76. point = bgView.layer.convert(point, from: self.layer)
  77. if !bgView.layer.contains(point){
  78. self.removeView()
  79. }
  80. }
  81. }
  82.  
  83. /// 移除弹框(内部移除)
  84. private func removeView() {
  85. UIView.animate(withDuration: 0.5, animations: { [weak self] in
  86. self?.alpha = 0
  87. }) { [weak self] (res) in
  88. self?.removeFromSuperview()
  89. }
  90. }
  91.  
  92. /// 初始化欢迎弹框
  93. convenience init(titleText:String? = nil,
  94. subtitle: String? = nil ,
  95. agree:String? = nil,
  96. buttonText: String? = nil) {
  97. self.init()
  98.  
  99. if agree != nil {
  100. self.titleLabel.text = titleText
  101. }
  102. if agree != nil {
  103. self.agreeLabel.text = agree
  104. }
  105. if subtitle != nil{
  106. self.subtitleLabel.text = subtitle
  107. }
  108.  
  109. if buttonText != nil{
  110. self.completeBtn.setTitle(buttonText, for: .normal)
  111. }
  112. }
  113.  
  114. /// 显示弹框
  115. func showAlert(selectedBtnBlock:((_ isSelected:Bool) -> Void)? , completeBtnBlock:(() -> Void)?) {
  116.  
  117. JYWindow.subviews.forEach { (v) in
  118. if v is JYRegisterProtocolView {
  119. return
  120. }
  121. }
  122.  
  123. JYWindow.addSubview(self)
  124. self.clickSelectedBtnBlock = selectedBtnBlock
  125. self.clickCompleteBtnBlock = completeBtnBlock
  126. self.alpha = 0
  127. self.isUserInteractionEnabled = false
  128. UIView.animate(withDuration: 0.5) {
  129. self.alpha = 1
  130. self.isUserInteractionEnabled = true
  131. }
  132. }
  133. }
  134.  
  135. // MARK: - 点击事件
  136. extension JYRegisterProtocolView{
  137.  
  138. /// 点击阅读
  139. @objc private func clickSelectedBtn(){
  140. selectedBtn.isSelected.toggle()
  141. if selectedBtn.isSelected == true {
  142. selectedBtn.backgroundColor = UIColor.black
  143. }else{
  144. selectedBtn.backgroundColor = UIColor.orange
  145. }
  146. clickSelectedBtnBlock?(selectedBtn.isSelected)
  147. }
  148.  
  149. /// 点击完成注册
  150. @objc private func clickcompleteBtn(){
  151. if selectedBtn.isSelected == false{
  152. DDLOG(message: "给个提示")
  153. }else{
  154. clickCompleteBtnBlock?()
  155. self.removeView()
  156. }
  157. }
  158. }
  159.  
  160. // MARK: - UI
  161. extension JYRegisterProtocolView{
  162. func configUI(){
  163.  
  164. self.backgroundColor = "000000".jy.getColor().withAlphaComponent(0.3)
  165. self.frame = UIScreen.main.bounds
  166. self.layoutIfNeeded()
  167.  
  168. configBgView()
  169. let vd : [String:UIView] = ["bgView":bgView]
  170. addSubview(bgView)
  171. self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|-24-[bgView]-24-|", options: [], metrics: nil, views: vd))
  172. self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[bgView]", options: [], metrics: nil, views: vd))
  173. bgView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
  174. bgView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
  175. addSubview(bgView)
  176.  
  177. }
  178.  
  179. /// 背景view的UI
  180. func configBgView(){
  181. let vd : [String : UIView] = ["titleLabel":titleLabel,
  182. "subtitleLabel":subtitleLabel,
  183. "selectedBtn":selectedBtn,
  184. "agreeLabel":agreeLabel,
  185. "completeBtn":completeBtn]
  186. bgView.addSubview(titleLabel)
  187. bgView.addSubview(subtitleLabel)
  188. bgView.addSubview(selectedBtn)
  189. bgView.addSubview(agreeLabel)
  190. bgView.addSubview(completeBtn)
  191.  
  192. bgView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|[titleLabel]|", options: [], metrics: nil, views: vd))
  193. bgView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|-15-[subtitleLabel]-15-|", options: [], metrics: nil, views: vd))
  194. bgView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "[selectedBtn(20)]-10-[agreeLabel]", options: [.alignAllCenterY], metrics: nil, views: vd))
  195. bgView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "|-50-[completeBtn]-50-|", options: [], metrics: nil, views: vd))
  196.  
  197. bgView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-15-[titleLabel]-10-[subtitleLabel]-30-[agreeLabel]-20-[completeBtn(50)]-20-|", options: [.alignAllCenterX], metrics: nil, views: vd))
  198. selectedBtn.heightAnchor.constraint(equalToConstant: 20).isActive = true
  199. }
  200. }

  

swift4.2 - 一个自定义view弹框的更多相关文章

  1. CodePush自定义更新弹框及下载进度条

    CodePush 热更新之自定义更新弹框及下载进度 先来几张弹框效果图 非强制更新场景 image 强制更新场景 image 更新包下载进度效果 image 核心代码 这里的热更新Modal框,是封装 ...

  2. 使用xib封装一个自定义view的步骤

    使用xib封装一个自定义view的步骤 1> 新建一个继承UIView的自定义view,假设类名叫做(MJAppView) 2> 新建一个MJAppView.xib文件来描述MJAppVi ...

  3. JavaScript实现自定义alert弹框

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAh0AAAFkCAYAAACEpYlzAAAfj0lEQVR4nO3dC5BddZ0n8F93pxOQCO

  4. 自定义 popWindow弹框 工具包

    前言:因为Android 没有像IOS一样的ActionSheet,虽然在github上看到有一些类似ActionSheet的库,总觉得不好用,不如自己写一个弹框通用类,样式全部自已来多好. Step ...

  5. vue中超简单的方法实现点击一个按钮出现弹框,点击弹框外关闭弹框

    效果图展示: View层 <template> <div> <div class="mask" v-if="showModal" ...

  6. 如何优雅的写一个Vue 的弹框

    写Vue或者是react 都会遇见弹框的问题.也尝试了多种办法来写弹框,一直都不太满意,今天特地看了一下 Element UI 的源码,模仿着写了一个简易版. 大概有一下几个问题: 1.弹框的层级问题 ...

  7. 自定义alert弹框,title不显示域名

    问题: 系统默认的alert弹框的title会默认显示网页域名 解决办法: (修改弹框样式) (function() { window.alert = function(name) { $(" ...

  8. 自定义alert弹框,title不显示域名(重写alert)

    问题: 系统默认的alert弹框的title会默认显示网页域名 解决办法: (修改弹框样式) (function() { window.alert = function(name) { $(" ...

  9. IOS中使用.xib文件封装一个自定义View

    1.新建一个继承UIView的自定义view,假设类名叫做 MyAppVew #import <UIKit/UIKit.h> @class MyApp; @interface MyAppV ...

随机推荐

  1. JVM 学习集合

    内存回收要做的事: 确定哪些内存需要回收,确定什么时候需要执行GC,如何执行GC 以最简单的本地变量引用:Object obj = new Object()为例: Object obj表示一个本地引用 ...

  2. js 编写一个神奇的四则运算

    写一个算法,有时候可以用简单的方法就可以写出来,但是只能针对特定的环境,如果要能够适应不同的环境,就需要对算法进行优化,在优化的过程中,你会觉得非常神奇,下面来看一个简单的四则运算的算法编写方式: 1 ...

  3. 使用jsoup爬取所有成语

    前几天看到有人在博问上求所有成语,想到刚好看了jsoup,就动手实践了一下,提问者给出了网站,一看很简单,就两种页面,一种是包含某个字的成语链接页面,一个是具体的包含某个字的成语的页面 下面是我的代码 ...

  4. 模糊查询内存查询java实现

    下面说说看到的工作项目中的代码,是这个样子的,事先查询一次数据库,将查询到的整张表的数据存到内存,以后使用时不再查询数据库,而直接操作内存中的数据,这主要用于数据库中的数据比较稳定,不会轻易改变的情况 ...

  5. SED命令用法整理

    sed '/Started/'q  匹配到Started字符串则退出sed命令 sed '/Started/{/in/q}'  同时匹配到Started和in两个字符时则退出sed命令 ------- ...

  6. 1.Tomcat配置.md

    1.启动 解压缩安装包后,点击startup.bat,保持控制台窗口开启 浏览器中输入http://localhost:8080 后看到启动界面则表示启动成功 点击shutdown.bat则关闭Tom ...

  7. 25.week4 docker build 也就是创建自己的image 上传image到dockerhub 从dockerhub下载images

    dado可以写你自己的名字 这个命令就会根据目录下的Dockerfile(固定用和这个名字)文件里面的内容 去下载并创建运行命令一步一步地 Setting up libxfixes3:amd64 (: ...

  8. CAP与Base理论

    分布一致性的提出 在分布式系统中要解决的一个重要问题就是数据的复制.在我们的日常开发经验中,相信很多开发人员都遇到过这样的问题:假设客户端C1将系统中的一个值K由V1更新为V2,但客户端C2无法立即读 ...

  9. 搭建GitLab+Jenkins

    1. Jenkins and GitLab Jenkins是一个自动化服务器,可以运行各种自动化构建.测试或部署任务. GitLab是一个代码仓库,用来管理代码. 两者结合起来,就可以实现开发者提交代 ...

  10. nbtscan工具

    这是一款用于扫描Windows网络上NetBIOS名字信息的程序.该程序对给出范围内的每一个地址发送NetBIOS状态查询,并且以易读的表格列出接收到的信息,对于每个响应的主机,NBTScan列出它的 ...