NewServerViewController.swift 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. //
  2. // NewServerViewController.swift
  3. // Bark
  4. //
  5. // Created by huangfeng on 2018/6/25.
  6. // Copyright © 2018 Fin. All rights reserved.
  7. //
  8. import Material
  9. import RxCocoa
  10. import RxSwift
  11. import SafariServices
  12. import SnapKit
  13. import UIKit
  14. class NewServerViewController: BaseViewController<NewServerViewModel> {
  15. let scanButton: BKButton = {
  16. let button = BKButton()
  17. button.setImage(UIImage(named: "baseline_qr_code_scanner_black_24pt"), for: .normal)
  18. button.frame = CGRect(x: 0, y: 0, width: 24, height: 24)
  19. button.hitTestSlop = UIEdgeInsets(top: -10, left: -10, bottom: -10, right: -10)
  20. button.tintColor = BKColor.grey.darken3
  21. return button
  22. }()
  23. lazy var addressTextField: TextField = {
  24. let textField = TextField()
  25. textField.keyboardType = .URL
  26. textField.placeholder = NSLocalizedString("ServerAddress")
  27. textField.detail = NSLocalizedString("ServerExample")
  28. textField.transition([.scale(0.85), .opacity(0)])
  29. textField.detailLabel.transition([.scale(0.85), .opacity(0)])
  30. textField.textColor = BKColor.grey.darken4
  31. textField.placeholderNormalColor = BKColor.grey.base
  32. textField.detailLabel.textColor = BKColor.grey.base
  33. textField.rightView?.grid.views = [scanButton]
  34. textField.rightViewMode = .whileEditing
  35. return textField
  36. }()
  37. let noticeLabel: UILabel = {
  38. let label = UILabel()
  39. label.text = NSLocalizedString("DeploymentDocuments")
  40. label.textColor = BKColor.blue.base
  41. label.font = UIFont.systemFont(ofSize: 12)
  42. label.transition([.scale(0.85), .opacity(0), .translate(x: 50)])
  43. label.isUserInteractionEnabled = true
  44. label.addGestureRecognizer(UITapGestureRecognizer())
  45. return label
  46. }()
  47. lazy var doneButton: BKButton = {
  48. let doneButton = BKButton()
  49. doneButton.setImage(Icon.check, for: .normal)
  50. doneButton.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
  51. navigationItem.setRightBarButtonItem(item: UIBarButtonItem(customView: doneButton))
  52. doneButton.tintColor = BKColor.grey.darken4
  53. return doneButton
  54. }()
  55. override func makeUI() {
  56. self.navigationItem.largeTitleDisplayMode = .never
  57. navigationItem.title = NSLocalizedString("AddServer")
  58. self.view.layout(addressTextField)
  59. .top(kNavigationHeight + 40).left(10).right(10)
  60. self.view.addSubview(noticeLabel)
  61. noticeLabel.snp.makeConstraints { make in
  62. make.top.equalTo(self.addressTextField.snp.bottom).offset(40)
  63. make.left.equalTo(self.addressTextField)
  64. }
  65. }
  66. override func bindViewModel() {
  67. // 点击提醒按钮事件
  68. let noticeTap = noticeLabel.gestureRecognizers!.first!.rx
  69. .event
  70. .map { _ -> () in
  71. ()
  72. }
  73. .asDriver(onErrorJustReturn: ())
  74. // 点击完成按钮事件
  75. let done = doneButton.rx.tap
  76. .map { [weak self] in
  77. self?.addressTextField.text ?? ""
  78. }
  79. .asDriver(onErrorDriveWith: .empty())
  80. // 页面显示事件
  81. let viewDidAppear = rx
  82. .methodInvoked(#selector(viewDidAppear(_:)))
  83. .map { _ in () }
  84. .asDriver(onErrorDriveWith: .empty())
  85. // 扫描二维码事件
  86. let scannerDidScan = self.scanButton.rx.tap.flatMapLatest {[weak self] _ -> Observable<String> in
  87. let controller = QRScannerViewController()
  88. self?.navigationController?.present(controller, animated: true, completion: nil)
  89. return controller.scannerDidSuccess
  90. }.asDriver(onErrorDriveWith: .empty())
  91. let output = viewModel.transform(
  92. input: NewServerViewModel.Input(
  93. noticeClick: noticeTap,
  94. done: done,
  95. viewDidAppear: viewDidAppear,
  96. didScan: scannerDidScan
  97. ))
  98. // 键盘显示与隐藏
  99. output.showKeyboard.drive(onNext: { [weak self] show in
  100. if show {
  101. _ = self?.addressTextField.becomeFirstResponder()
  102. }
  103. else {
  104. self?.addressTextField.resignFirstResponder()
  105. }
  106. }).disposed(by: rx.disposeBag)
  107. // 点击教程
  108. output.notice.drive(onNext: { [weak self] url in
  109. self?.navigationController?.present(BarkSFSafariViewController(url: url), animated: true, completion: nil)
  110. }).disposed(by: rx.disposeBag)
  111. // URL文本框文本
  112. output.urlText
  113. .drive(self.addressTextField.rx.text)
  114. .disposed(by: rx.disposeBag)
  115. // 退出页面
  116. output.pop.drive(onNext: { [weak self] _ in
  117. self?.navigationController?.popViewController(animated: true)
  118. }).disposed(by: rx.disposeBag)
  119. // 弹出提示文本
  120. output.showSnackbar.drive(onNext: { [weak self] text in
  121. self?.showSnackbar(text: text)
  122. }).disposed(by: rx.disposeBag)
  123. }
  124. }