IHRoomPicker.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. //
  2. // IHRoomPicker.swift
  3. // Inhealth
  4. //
  5. // Created by weclouds on 2020/3/4.
  6. // Copyright © 2020 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. import IBAnimatable
  10. enum TableViewType: Int { case build = 100, floor = 200, room = 300 }
  11. fileprivate let buildCellId = "buildCellId"
  12. fileprivate let floorCellId = "floorCellId"
  13. fileprivate let roomCellId = "roomCellId"
  14. class IHRoomPicker: AnimatableModalViewController {
  15. var shouldReset: Bool? = false
  16. var hotelId:String?{
  17. didSet{
  18. if let hotelId = self.hotelId{
  19. self.loadData(hotelId)
  20. }
  21. }
  22. }
  23. @IBOutlet weak var scrollViewHeightConstaint: NSLayoutConstraint!
  24. @IBOutlet weak var scrollView: UIScrollView!
  25. @IBOutlet weak var buildButton: UIButton!
  26. @IBOutlet weak var floorButton: UIButton!
  27. @IBOutlet weak var roomButton: UIButton!
  28. fileprivate var buttons :[UIButton] = []
  29. fileprivate var build_tb: UITableView?
  30. fileprivate var floor_tb: UITableView?
  31. fileprivate var room_tb: UITableView?
  32. fileprivate var builds: [DropDownData] = []
  33. fileprivate var floors: [DropDownData] = []
  34. fileprivate var rooms: [DropDownData] = []
  35. fileprivate var buildSelIndexPath: IndexPath?
  36. fileprivate var floorSelIndexPath: IndexPath?
  37. fileprivate var roomSeIndexPath: IndexPath?
  38. fileprivate var sel_build: String = "" {
  39. didSet {
  40. buildButton.setTitle(self.sel_build, for: UIControl.State.normal)
  41. floorButton.setTitle("please choose", for: UIControl.State.normal)
  42. roomButton.setTitle(nil, for: UIControl.State.normal)
  43. }
  44. }
  45. fileprivate var sel_floor: String = "" {
  46. didSet {
  47. floorButton.setTitle(self.sel_floor, for: UIControl.State.normal)
  48. roomButton.setTitle("please choose", for: UIControl.State.normal)
  49. }
  50. }
  51. fileprivate var sel_room: String = "" {
  52. didSet {
  53. roomButton.setTitle(self.sel_room, for: UIControl.State.normal)
  54. }
  55. }
  56. typealias RoomAction = (( _ build: String,_ floor: String,_ room: String, _ roomId:String) -> Void)?
  57. var selectedRoomCompleted: RoomAction = nil
  58. override func viewDidLoad() {
  59. super.viewDidLoad()
  60. setupUI()
  61. }
  62. @IBAction func dissButtonClicked(_ sender: Any) {
  63. dismiss()
  64. }
  65. fileprivate func dismiss() {
  66. self.dismiss(animated: true, completion: nil)
  67. guard let hotelID = self.hotelId else { return }
  68. self.reset(hotelID)
  69. }
  70. @IBAction func buildClick(_ sender: Any) {
  71. guard let hotelID = self.hotelId else { return }
  72. self.reset(hotelID)
  73. }
  74. @IBAction func floorClick(_ sender: Any) {
  75. if self.builds.count == 0 {
  76. return
  77. }
  78. floorButton.setTitle("please choose", for: UIControl.State.normal)
  79. roomButton.setTitle(nil, for: UIControl.State.normal)
  80. let build = self.builds.first
  81. self.sel_build = (build?.name!)!
  82. IHLoginService.share.getFloorList((build?.id!)!, requstSuccess: { (floorlist) in
  83. self.floors = floorlist
  84. self.scrollView.contentSize = CGSize(width: KSCREENWIDTH * 2, height: self.scrollViewHeight)
  85. self.floor_tb?.reloadData()
  86. self.scrollView.setContentOffset(CGPoint(x: KSCREENWIDTH, y: 0), animated: true)
  87. }) {
  88. }
  89. }
  90. @IBAction func roomClick(_ sender: Any) {
  91. if self.floors.count == 0{
  92. return
  93. }
  94. roomButton.setTitle("please choose", for: UIControl.State.normal)
  95. let floor = self.floors.first
  96. self.sel_floor = (floor?.name!)!
  97. IHLoginService.share.getRoomList((floor?.id!)!, requstSuccess: { (roomlist) in
  98. self.rooms = roomlist
  99. self.scrollView.contentSize = CGSize(width: KSCREENWIDTH * 3, height: self.scrollViewHeight)
  100. self.room_tb?.reloadData()
  101. self.scrollView.setContentOffset(CGPoint(x: KSCREENWIDTH * 2, y: 0), animated: true)
  102. }) {
  103. }
  104. }
  105. }
  106. extension IHRoomPicker{
  107. fileprivate func setupUI() {
  108. setupTalbeView()
  109. setupButtons()
  110. }
  111. fileprivate func setupTalbeView() {
  112. scrollView.delegate = self
  113. if #available(iOS 11.0, *) {
  114. scrollView.contentInsetAdjustmentBehavior = .never
  115. } else {
  116. self.automaticallyAdjustsScrollViewInsets = false
  117. }
  118. build_tb = factoryTableView(type: .build, cellIdentifier: buildCellId)
  119. scrollView.addSubview(build_tb!)
  120. floor_tb = factoryTableView(type: .floor, cellIdentifier: floorCellId)
  121. scrollView.addSubview(floor_tb!)
  122. room_tb = factoryTableView(type: .room, cellIdentifier: roomCellId)
  123. scrollView.addSubview(room_tb!)
  124. scrollView.isScrollEnabled = false
  125. scrollView.showsHorizontalScrollIndicator = false
  126. scrollView.showsVerticalScrollIndicator = false
  127. }
  128. fileprivate func setupButtons() {
  129. buildButton.isSelected = true
  130. buttons = [buildButton, floorButton, roomButton]
  131. _ = buttons.map {
  132. $0.setTitleColor(UIColor.darkGray, for: UIControl.State.normal)
  133. $0.setTitleColor(UIColor.black, for: UIControl.State.selected)
  134. }
  135. }
  136. }
  137. extension IHRoomPicker{
  138. fileprivate func loadData(_ hotelId:String) {
  139. IHLoginService.share.getBuildList(hotelId, requstSuccess: { (buildlist) in
  140. self.builds = buildlist
  141. self.build_tb?.reloadData()
  142. }) {
  143. }
  144. }
  145. fileprivate func reset(_ hotelId:String) {
  146. IHLoginService.share.getBuildList(hotelId, requstSuccess: { (buildlist) in
  147. self.builds = buildlist
  148. self.build_tb?.reloadData()
  149. self.scrollView.contentSize = CGSize(width: KSCREENWIDTH * 1, height: self.scrollViewHeight)
  150. self.scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
  151. self.buildButton.setTitle("please choose", for: UIControl.State.normal)
  152. self.floorButton.setTitle(nil, for: UIControl.State.normal)
  153. self.roomButton.setTitle(nil, for: UIControl.State.normal)
  154. }) {
  155. }
  156. }
  157. }
  158. extension IHRoomPicker {
  159. var scrollViewHeight: CGFloat {
  160. return 225
  161. }
  162. var tbFrame: CGRect { return CGRect(x: 0, y: 0, width: KSCREENWIDTH, height: scrollViewHeight) }
  163. }
  164. extension IHRoomPicker{
  165. fileprivate func factoryTableView(type: TableViewType, cellIdentifier: String) -> UITableView {
  166. let tb = UITableView(frame: tbFrame, style: UITableView.Style.plain)
  167. tb.register(UINib.init(nibName: "IHSelectedRoomCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
  168. if #available(iOS 11.0, *) { tb.contentInsetAdjustmentBehavior = .never }
  169. else { self.automaticallyAdjustsScrollViewInsets = false }
  170. tb.separatorStyle = UITableViewCell.SeparatorStyle.none
  171. tb.tableHeaderView = UIView()
  172. tb.tableFooterView = UIView()
  173. tb.tag = type.rawValue
  174. tb.dataSource = self
  175. tb.delegate = self
  176. tb.rowHeight = 44
  177. var frame = tb.frame
  178. switch type {
  179. case .build: frame.origin.x = 0
  180. case .floor: frame.origin.x = KSCREENWIDTH
  181. case .room: frame.origin.x = KSCREENWIDTH * 2
  182. }
  183. tb.frame = frame
  184. return tb
  185. }
  186. }
  187. extension IHRoomPicker : UITableViewDataSource,UITableViewDelegate {
  188. func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
  189. return 44.0
  190. }
  191. func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  192. let type = TableViewType(rawValue: tableView.tag)!
  193. switch type {
  194. case .build:
  195. return builds.count
  196. case .floor:
  197. return floors.count
  198. case .room:
  199. return rooms.count
  200. }
  201. }
  202. func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  203. let type = TableViewType(rawValue: tableView.tag)!
  204. switch type {
  205. case .build:
  206. let cell = tableView.dequeueReusableCell(withIdentifier: buildCellId, for: indexPath) as! IHSelectedRoomCell
  207. cell.nameLabel?.text = builds[indexPath.row].name
  208. return cell
  209. case .floor:
  210. let cell = tableView.dequeueReusableCell(withIdentifier: floorCellId, for: indexPath) as! IHSelectedRoomCell
  211. cell.nameLabel?.text = floors[indexPath.row].name
  212. return cell
  213. case .room:
  214. let cell = tableView.dequeueReusableCell(withIdentifier: roomCellId, for: indexPath) as! IHSelectedRoomCell
  215. if rooms.count > 0 {
  216. cell.nameLabel?.text = rooms[indexPath.row].number
  217. }
  218. return cell
  219. }
  220. }
  221. func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
  222. let type = TableViewType(rawValue: tableView.tag)!
  223. switch type {
  224. case .build:
  225. if let buildSelIndexPath = buildSelIndexPath {
  226. if buildSelIndexPath != indexPath {
  227. floorSelIndexPath = nil
  228. roomSeIndexPath = nil
  229. }
  230. }
  231. buildSelIndexPath = indexPath
  232. self.sel_build = self.builds[indexPath.row].name!
  233. IHLoginService.share.getFloorList(self.builds[indexPath.row].id!, requstSuccess: { (floorlist) in
  234. self.floors = floorlist
  235. self.scrollView.contentSize = CGSize(width: KSCREENWIDTH * 2, height: self.scrollViewHeight)
  236. self.floor_tb?.reloadData()
  237. self.scrollView.setContentOffset(CGPoint(x: KSCREENWIDTH, y: 0), animated: true)
  238. }) {
  239. }
  240. case .floor:
  241. if let floorSelIndexPath = floorSelIndexPath {
  242. if floorSelIndexPath != indexPath { roomSeIndexPath = nil }
  243. }
  244. floorSelIndexPath = indexPath
  245. self.sel_floor = self.floors[indexPath.row].name!
  246. IHLoginService.share.getRoomList(self.floors[indexPath.row].id!, requstSuccess: { (roomlist) in
  247. self.rooms = roomlist
  248. // if self.rooms.count > 0 {
  249. self.scrollView.contentSize = CGSize(width: KSCREENWIDTH * 3, height: self.scrollViewHeight)
  250. self.room_tb?.reloadData()
  251. self.scrollView.setContentOffset(CGPoint(x: KSCREENWIDTH * 2, y: 0), animated: true)
  252. // } else {
  253. //
  254. // }
  255. }) {
  256. }
  257. case .room:
  258. roomSeIndexPath = indexPath
  259. sel_room = rooms[indexPath.row].number!
  260. log.debug("room - \(sel_room)")
  261. selectedRoomCompleted?(sel_build, sel_floor, sel_room,rooms[indexPath.row].id!)
  262. dismiss()
  263. }
  264. }
  265. }
  266. extension IHRoomPicker:UIScrollViewDelegate{
  267. func scrollViewDidScroll(_ scrollView: UIScrollView) {
  268. if scrollView.tag != 0 { return }
  269. _ = buttons.map { $0.isSelected = false }
  270. if scrollView.contentOffset.x == 0 { buildButton.isSelected = true }
  271. if scrollView.contentOffset.x == KSCREENWIDTH { floorButton.isSelected = true }
  272. if scrollView.contentOffset.x == KSCREENWIDTH * 2 { roomButton.isSelected = true }
  273. }
  274. }
  275. extension IHRoomPicker {
  276. override func updateViewConstraints() {
  277. super.updateViewConstraints()
  278. self.scrollViewHeightConstaint.constant = scrollViewHeight
  279. }
  280. }