MobileLoginView.swift 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. //
  2. // MobileLoginView.swift
  3. // RainbowPlanet
  4. //
  5. // Created by 南鑫林 on 2019/4/17.
  6. // Copyright © 2019 南鑫林. All rights reserved.
  7. //
  8. import UIKit
  9. import RxSwift
  10. import RxCocoa
  11. import SwiftyMediator
  12. class MobileLoginView: BaseView {
  13. /// 手机号
  14. var phoneNumber : String = ""
  15. /// 验证码
  16. var sms : String = ""
  17. /// 邀请码
  18. var invitationCode : String = ""
  19. typealias SendSmSBlock = (_ smsButton: CountdownButton,_ phoneNumber : String) -> Void
  20. var sendSmSBlock : SendSmSBlock?
  21. typealias LoginBlock = (_ phoneNumber : String ,_ sms : String,_ invitationCode : String) -> Void
  22. var loginBlock : LoginBlock?
  23. typealias PasswordLoginBlock = () -> Void
  24. var passwordLoginBlock : PasswordLoginBlock?
  25. override func setupViews() {
  26. addSubview(bindPhoneNumberLabel)
  27. addSubview(phoneNumberBgView)
  28. phoneNumberBgView.addSubview(linePhoneNumberLabel)
  29. phoneNumberBgView.addSubview(phoneAreaCodeLabel)
  30. phoneNumberBgView.addSubview(phoneNumberTextField)
  31. addSubview(smsBgView)
  32. smsBgView.addSubview(linesmsLabel)
  33. smsBgView.addSubview(smsButton)
  34. smsBgView.addSubview(smsTextField)
  35. addSubview(invitationCodeBgView)
  36. invitationCodeBgView.addSubview(lineInvitationCodeLabel)
  37. invitationCodeBgView.addSubview(invitationCodeTextField)
  38. addSubview(loginButton)
  39. addSubview(passwordLoginButton)
  40. addSubview(agreementButton)
  41. addSubview(oneLabel)
  42. addSubview(twoLabel)
  43. }
  44. override func setupLayouts() {
  45. bindPhoneNumberLabel.snp.makeConstraints { (make) in
  46. make.top.equalToSuperview().offset(kScaleValue(value: 75))
  47. make.left.equalToSuperview().offset(kScaleValue(value: 38))
  48. }
  49. phoneNumberBgView.snp.makeConstraints { (make) in
  50. make.left.equalToSuperview().offset(kScaleValue(value: 38))
  51. make.right.equalToSuperview().offset(kScaleValue(value: -38))
  52. make.top.equalTo(bindPhoneNumberLabel.snp.bottom).offset(kScaleValue(value: 50))
  53. make.height.equalTo(kScaleValue(value: 48))
  54. }
  55. linePhoneNumberLabel.snp.makeConstraints { (make) in
  56. make.left.right.bottom.equalToSuperview()
  57. make.height.equalTo(0.5)
  58. }
  59. phoneAreaCodeLabel.snp.makeConstraints { (make) in
  60. make.top.equalToSuperview().offset(kScaleValue(value: 6))
  61. make.left.equalToSuperview().offset(kScaleValue(value: 4))
  62. make.bottom.equalToSuperview()
  63. }
  64. phoneNumberTextField.snp.makeConstraints { (make) in
  65. make.left.equalTo(phoneAreaCodeLabel.snp.right).offset(kScaleValue(value: 30))
  66. make.top.bottom.equalTo(phoneAreaCodeLabel)
  67. make.width.equalTo(kScreenWidth-kScaleValue(value: 76+34+30))
  68. }
  69. smsBgView.snp.makeConstraints { (make) in
  70. make.left.height.right.equalTo(phoneNumberBgView)
  71. make.top.equalTo(phoneNumberBgView.snp.bottom)
  72. }
  73. linesmsLabel.snp.makeConstraints { (make) in
  74. make.left.right.bottom.equalToSuperview()
  75. make.height.equalTo(0.5)
  76. }
  77. smsButton.snp.makeConstraints { (make) in
  78. make.bottom.equalToSuperview().offset(kScaleValue(value: -8))
  79. make.height.equalTo(kScaleValue(value: 30))
  80. make.right.equalToSuperview().offset(kScaleValue(value: -4))
  81. }
  82. smsTextField.snp.makeConstraints { (make) in
  83. make.bottom.top.equalTo(smsButton)
  84. make.left.equalTo(phoneAreaCodeLabel)
  85. make.width.equalTo(kScreenWidth - kScaleValue(value: 76 + 30 + smsButton.width))
  86. }
  87. invitationCodeBgView.snp.makeConstraints { (make) in
  88. make.top.equalTo(smsBgView.snp.bottom)
  89. make.left.right.height.equalTo(phoneNumberBgView)
  90. }
  91. lineInvitationCodeLabel.snp.makeConstraints { (make) in
  92. make.left.right.bottom.equalToSuperview()
  93. make.height.equalTo(0.5)
  94. }
  95. invitationCodeTextField.snp.makeConstraints { (make) in
  96. make.left.right.equalToSuperview()
  97. make.top.equalToSuperview().offset(kScaleValue(value: 6))
  98. make.height.equalTo(phoneAreaCodeLabel)
  99. }
  100. loginButton.snp.makeConstraints { (make) in
  101. make.top.equalTo(invitationCodeBgView.snp.bottom).offset(kScaleValue(value: 35))
  102. make.height.equalTo(kScaleValue(value:44))
  103. make.left.equalToSuperview().offset(kScaleValue(value: 38))
  104. make.right.equalToSuperview().offset(kScaleValue(value: -38))
  105. }
  106. passwordLoginButton.snp.makeConstraints { (make) in
  107. make.top.equalTo(loginButton.snp.bottom).offset(20)
  108. make.centerX.equalToSuperview()
  109. }
  110. agreementButton.snp.makeConstraints { (make) in
  111. make.bottom.equalTo(-32*kScaleWidth)
  112. make.left.equalTo(92.5*kScaleWidth)
  113. make.size.equalTo(20)
  114. }
  115. oneLabel.snp.makeConstraints { (make) in
  116. make.centerY.equalTo(agreementButton)
  117. make.left.equalTo(agreementButton.snp.right).offset(6.5)
  118. }
  119. twoLabel.snp.makeConstraints { (make) in
  120. make.centerY.equalTo(agreementButton)
  121. make.left.equalTo(oneLabel.snp.right)
  122. }
  123. }
  124. private lazy var bindPhoneNumberLabel: UILabel = {
  125. let bindPhoneNumberLabel = UILabel()
  126. bindPhoneNumberLabel.text = "手机验证登录"
  127. bindPhoneNumberLabel.textColor = k333333Color
  128. bindPhoneNumberLabel.font = kScaleBoldFont22
  129. return bindPhoneNumberLabel
  130. }()
  131. private lazy var phoneNumberBgView: UIView = {
  132. let phoneNumberBgView = UIView()
  133. return phoneNumberBgView
  134. }()
  135. private lazy var linePhoneNumberLabel: UILabel = {
  136. let linePhoneNumberLabel = UILabel()
  137. linePhoneNumberLabel.backgroundColor = ke6e6e6Color
  138. return linePhoneNumberLabel
  139. }()
  140. private lazy var phoneAreaCodeLabel: UILabel = {
  141. let phoneAreaCodeLabel = UILabel()
  142. phoneAreaCodeLabel.text = "+86"
  143. phoneAreaCodeLabel.textColor = k333333Color
  144. phoneAreaCodeLabel.font = kScaleRegularFont16
  145. phoneAreaCodeLabel.sizeToFit()
  146. return phoneAreaCodeLabel
  147. }()
  148. private lazy var phoneNumberTextField : UITextField = {
  149. let phoneNumberTextField = UITextField()
  150. phoneNumberTextField.placeholder = "手机号码"
  151. phoneNumberTextField.borderStyle = .none
  152. phoneNumberTextField.textColor = k666666Color
  153. phoneNumberTextField.font = kScaleRegularFont16
  154. phoneNumberTextField.clearButtonMode = .whileEditing
  155. phoneNumberTextField.sizeToFit()
  156. phoneNumberTextField.keyboardType = .numberPad
  157. phoneNumberTextField.tintColor = kThemeColor
  158. phoneNumberTextField.rx.text.orEmpty.changed.subscribe(onNext: { [weak self] (text) in
  159. self?.phoneNumberTextField.text = String(text.prefix(11))
  160. self?.phoneNumber = self?.phoneNumberTextField.text ?? ""
  161. self?.observableString()
  162. }).disposed(by: disposeBag)
  163. return phoneNumberTextField
  164. }()
  165. private lazy var smsBgView: UIView = {
  166. let smsBgView = UIView()
  167. return smsBgView
  168. }()
  169. private lazy var linesmsLabel: UILabel = {
  170. let linesmsLabel = UILabel()
  171. linesmsLabel.backgroundColor = ke6e6e6Color
  172. return linesmsLabel
  173. }()
  174. private lazy var smsButton: CountdownButton = {
  175. let smsButton = CountdownButton(type: UIButton.ButtonType.custom)
  176. smsButton.normalText = " 获取验证码 "
  177. smsButton.disabledText = " seconds后重新获取 "
  178. smsButton.setTitle(smsButton.normalText, for: UIControl.State.normal)
  179. smsButton.setTitle(smsButton.disabledText, for: UIControl.State.disabled)
  180. smsButton.setTitleColor(kThemeColor, for: UIControl.State.normal)
  181. smsButton.setTitleColor(k333333Color, for: UIControl.State.disabled)
  182. smsButton.titleLabel?.font = kRegularFont12
  183. smsButton.contentHorizontalAlignment = UIControl.ContentHorizontalAlignment.center
  184. smsButton.sizeToFit()
  185. smsButton.normalBorderColor = kThemeColor
  186. smsButton.normalBorderWidth = 0.5
  187. smsButton.normalCornerRadius = kScaleValue(value: 15)
  188. smsButton.normalBackgroundColor = UIColor.white
  189. smsButton.disabledBorderColor = ke6e6e6Color
  190. smsButton.disabledBorderWidth = 0.5
  191. smsButton.disabledCornerRadius = kScaleValue(value: 15)
  192. smsButton.disabledBackgroundColor = ke6e6e6Color
  193. smsButton.maxSecond = 60
  194. smsButton.updateNormal()
  195. smsButton.rx.tap.subscribe(onNext: { [weak self] (data) in
  196. if (self?.phoneNumber.count)! < 11 || (self?.phoneNumber.count)! > 11 {
  197. SwiftProgressHUD.shared().showText("手机号码格式错误, \n请重新输入!", textAlignment: .left)
  198. return
  199. }
  200. if let sendSmSBlock = self?.sendSmSBlock {
  201. sendSmSBlock(smsButton, (self?.phoneNumber)!)
  202. }
  203. }).disposed(by: disposeBag)
  204. return smsButton
  205. }()
  206. private lazy var smsTextField : UITextField = {
  207. let smsTextField = UITextField()
  208. smsTextField.placeholder = "验证码"
  209. smsTextField.borderStyle = .none
  210. smsTextField.textColor = k666666Color
  211. smsTextField.font = kScaleRegularFont16
  212. smsTextField.sizeToFit()
  213. smsTextField.keyboardType = .numberPad
  214. smsTextField.tintColor = kThemeColor
  215. smsTextField.rx.text.changed.subscribe(onNext: { [weak self] (text) in
  216. self?.smsTextField.text = String(text?.prefix(6) ?? "") as String
  217. self?.sms = self?.smsTextField.text ?? ""
  218. self?.observableString()
  219. }).disposed(by: disposeBag)
  220. return smsTextField
  221. }()
  222. private lazy var invitationCodeBgView: UIView = {
  223. let invitationCodeBgView = UIView()
  224. return invitationCodeBgView
  225. }()
  226. private lazy var lineInvitationCodeLabel: UILabel = {
  227. let lineInvitationCodeLabel = UILabel()
  228. lineInvitationCodeLabel.backgroundColor = ke6e6e6Color
  229. return lineInvitationCodeLabel
  230. }()
  231. private lazy var invitationCodeTextField : UITextField = {
  232. let invitationCodeTextField = UITextField()
  233. invitationCodeTextField.placeholder = "请输入邀请码(选填)"
  234. invitationCodeTextField.borderStyle = .none
  235. invitationCodeTextField.textColor = k666666Color
  236. invitationCodeTextField.font = kScaleRegularFont16
  237. invitationCodeTextField.clearButtonMode = .whileEditing
  238. invitationCodeTextField.sizeToFit()
  239. invitationCodeTextField.tintColor = kThemeColor
  240. invitationCodeTextField.rx.text.orEmpty.changed.subscribe(onNext: { [weak self] (text) in
  241. self?.invitationCode = self?.invitationCodeTextField.text ?? ""
  242. }).disposed(by: disposeBag)
  243. return invitationCodeTextField
  244. }()
  245. private lazy var loginButton: UIButton = {
  246. let loginButton = UIButton(type: UIButton.ButtonType.custom)
  247. loginButton.setTitle("登录", for: UIControl.State.normal)
  248. loginButton.setTitleColor(kffffffColor, for: UIControl.State.normal)
  249. loginButton.setTitleColor(k666666Color, for: UIControl.State.disabled)
  250. loginButton.setBackgroundImage(UIImage.imageWithColor(color: kDisabledButtonColor), for: UIControl.State.disabled)
  251. loginButton.setBackgroundImage(UIImage.imageWithColor(color: kEnabledButtonColor), for: UIControl.State.normal)
  252. loginButton.titleLabel?.font = kScaleRegularFont18
  253. loginButton.cornerRadius = kScaleValue(value: 22)
  254. loginButton.masksToBounds = true
  255. loginButton.isEnabled = false
  256. loginButton.rx.tap.subscribe(onNext: { [weak self] (data) in
  257. if let loginBlock = self?.loginBlock {
  258. loginBlock((self?.phoneNumber)!,(self?.sms)!, (self?.invitationCode)!)
  259. }
  260. }).disposed(by: disposeBag)
  261. return loginButton
  262. }()
  263. private lazy var passwordLoginButton: UIButton = {
  264. let passwordLoginButton = UIButton(type: UIButton.ButtonType.custom)
  265. passwordLoginButton.setTitle("密码登录", for: UIControl.State.normal)
  266. passwordLoginButton.setTitleColor(k1C2443Color, for: UIControl.State.normal)
  267. passwordLoginButton.titleLabel?.font = kScaleRegularFont14
  268. passwordLoginButton.rx.tap.subscribe(onNext: { [weak self] (data) in
  269. if let passwordLoginBlock = self?.passwordLoginBlock {
  270. passwordLoginBlock()
  271. }
  272. }).disposed(by: disposeBag)
  273. return passwordLoginButton
  274. }()
  275. func observableString() {
  276. Observable.combineLatest(Observable.just(phoneNumber), Observable.just(sms)) { [weak self] (textValue1, textValue2) -> Bool in
  277. let textValue1 = String(textValue1.prefix(11)) as String
  278. let textValue2 = String(textValue2.prefix(6)) as String
  279. let isSuccess = (textValue1.count == 11) && (textValue2.count == 6) && (self?.agreementButton.isSelected == true)
  280. return isSuccess
  281. }.subscribe(onNext: {
  282. [weak self] isEmpty in
  283. self?.loginButton.isEnabled = isEmpty
  284. }).disposed(by: self.disposeBag)
  285. }
  286. lazy var agreementButton: UIButton = {
  287. let agreementButton = UIButton(type: UIButton.ButtonType.custom)
  288. agreementButton.setImage(kImage(name: "login_terms_normal"), for: UIControl.State.normal)
  289. agreementButton.setImage(kImage(name: "login_terms_pre"), for: UIControl.State.selected)
  290. agreementButton.isSelected = true
  291. agreementButton.rx.tap.subscribe(onNext: { [weak self] in
  292. agreementButton.isSelected = !agreementButton.isSelected
  293. self?.loginButton.isEnabled = agreementButton.isSelected
  294. }).disposed(by: disposeBag)
  295. return agreementButton
  296. }()
  297. lazy var oneLabel: UILabel = {
  298. let oneLabel = UILabel()
  299. oneLabel.text = "我已阅读并同意 "
  300. oneLabel.textColor = k999999Color
  301. oneLabel.font = kRegularFont12
  302. return oneLabel
  303. }()
  304. lazy var twoLabel: UILabel = {
  305. let twoLabel = UILabel()
  306. twoLabel.textColor = k999999Color
  307. twoLabel.font = kRegularFont12
  308. twoLabel.addTapGesture(1, target: self, action: #selector(agreement))
  309. let attribute = NSMutableAttributedString(string: "服务和隐私条款")
  310. attribute.changeUnderline(atAllStyle: NSUnderlineStyle.single, color: k999999Color)
  311. twoLabel.attributedText = attribute
  312. return twoLabel
  313. }()
  314. @objc func agreement() {
  315. Mediator.push(H5RouterModuleType.pushContentId6)
  316. }
  317. }