// // IHRoomPicker.swift // Inhealth // // Created by weclouds on 2020/3/4. // Copyright © 2020 weclouds. All rights reserved. // import UIKit import IBAnimatable enum TableViewType: Int { case build = 100, floor = 200, room = 300 } fileprivate let buildCellId = "buildCellId" fileprivate let floorCellId = "floorCellId" fileprivate let roomCellId = "roomCellId" class IHRoomPicker: AnimatableModalViewController { var shouldReset: Bool? = false var hotelId:String?{ didSet{ if let hotelId = self.hotelId{ self.loadData(hotelId) } } } @IBOutlet weak var scrollViewHeightConstaint: NSLayoutConstraint! @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var buildButton: UIButton! @IBOutlet weak var floorButton: UIButton! @IBOutlet weak var roomButton: UIButton! fileprivate var buttons :[UIButton] = [] fileprivate var build_tb: UITableView? fileprivate var floor_tb: UITableView? fileprivate var room_tb: UITableView? fileprivate var builds: [DropDownData] = [] fileprivate var floors: [DropDownData] = [] fileprivate var rooms: [DropDownData] = [] fileprivate var buildSelIndexPath: IndexPath? fileprivate var floorSelIndexPath: IndexPath? fileprivate var roomSeIndexPath: IndexPath? fileprivate var sel_build: String = "" { didSet { buildButton.setTitle(self.sel_build, for: UIControl.State.normal) floorButton.setTitle("please choose", for: UIControl.State.normal) roomButton.setTitle(nil, for: UIControl.State.normal) } } fileprivate var sel_floor: String = "" { didSet { floorButton.setTitle(self.sel_floor, for: UIControl.State.normal) roomButton.setTitle("please choose", for: UIControl.State.normal) } } fileprivate var sel_room: String = "" { didSet { roomButton.setTitle(self.sel_room, for: UIControl.State.normal) } } typealias RoomAction = (( _ build: String,_ floor: String,_ room: String, _ roomId:String) -> Void)? var selectedRoomCompleted: RoomAction = nil override func viewDidLoad() { super.viewDidLoad() setupUI() } @IBAction func dissButtonClicked(_ sender: Any) { dismiss() } fileprivate func dismiss() { self.dismiss(animated: true, completion: nil) guard let hotelID = self.hotelId else { return } self.reset(hotelID) } @IBAction func buildClick(_ sender: Any) { guard let hotelID = self.hotelId else { return } self.reset(hotelID) } @IBAction func floorClick(_ sender: Any) { if self.builds.count == 0 { return } floorButton.setTitle("please choose", for: UIControl.State.normal) roomButton.setTitle(nil, for: UIControl.State.normal) let build = self.builds.first self.sel_build = (build?.name!)! IHLoginService.share.getFloorList((build?.id!)!, requstSuccess: { (floorlist) in self.floors = floorlist self.scrollView.contentSize = CGSize(width: KSCREENWIDTH * 2, height: self.scrollViewHeight) self.floor_tb?.reloadData() self.scrollView.setContentOffset(CGPoint(x: KSCREENWIDTH, y: 0), animated: true) }) { } } @IBAction func roomClick(_ sender: Any) { if self.floors.count == 0{ return } roomButton.setTitle("please choose", for: UIControl.State.normal) let floor = self.floors.first self.sel_floor = (floor?.name!)! IHLoginService.share.getRoomList((floor?.id!)!, requstSuccess: { (roomlist) in self.rooms = roomlist self.scrollView.contentSize = CGSize(width: KSCREENWIDTH * 3, height: self.scrollViewHeight) self.room_tb?.reloadData() self.scrollView.setContentOffset(CGPoint(x: KSCREENWIDTH * 2, y: 0), animated: true) }) { } } } extension IHRoomPicker{ fileprivate func setupUI() { setupTalbeView() setupButtons() } fileprivate func setupTalbeView() { scrollView.delegate = self if #available(iOS 11.0, *) { scrollView.contentInsetAdjustmentBehavior = .never } else { self.automaticallyAdjustsScrollViewInsets = false } build_tb = factoryTableView(type: .build, cellIdentifier: buildCellId) scrollView.addSubview(build_tb!) floor_tb = factoryTableView(type: .floor, cellIdentifier: floorCellId) scrollView.addSubview(floor_tb!) room_tb = factoryTableView(type: .room, cellIdentifier: roomCellId) scrollView.addSubview(room_tb!) scrollView.isScrollEnabled = false scrollView.showsHorizontalScrollIndicator = false scrollView.showsVerticalScrollIndicator = false } fileprivate func setupButtons() { buildButton.isSelected = true buttons = [buildButton, floorButton, roomButton] _ = buttons.map { $0.setTitleColor(UIColor.darkGray, for: UIControl.State.normal) $0.setTitleColor(UIColor.black, for: UIControl.State.selected) } } } extension IHRoomPicker{ fileprivate func loadData(_ hotelId:String) { IHLoginService.share.getBuildList(hotelId, requstSuccess: { (buildlist) in self.builds = buildlist self.build_tb?.reloadData() }) { } } fileprivate func reset(_ hotelId:String) { IHLoginService.share.getBuildList(hotelId, requstSuccess: { (buildlist) in self.builds = buildlist self.build_tb?.reloadData() self.scrollView.contentSize = CGSize(width: KSCREENWIDTH * 1, height: self.scrollViewHeight) self.scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: true) self.buildButton.setTitle("please choose", for: UIControl.State.normal) self.floorButton.setTitle(nil, for: UIControl.State.normal) self.roomButton.setTitle(nil, for: UIControl.State.normal) }) { } } } extension IHRoomPicker { var scrollViewHeight: CGFloat { return 225 } var tbFrame: CGRect { return CGRect(x: 0, y: 0, width: KSCREENWIDTH, height: scrollViewHeight) } } extension IHRoomPicker{ fileprivate func factoryTableView(type: TableViewType, cellIdentifier: String) -> UITableView { let tb = UITableView(frame: tbFrame, style: UITableView.Style.plain) tb.register(UINib.init(nibName: "IHSelectedRoomCell", bundle: nil), forCellReuseIdentifier: cellIdentifier) if #available(iOS 11.0, *) { tb.contentInsetAdjustmentBehavior = .never } else { self.automaticallyAdjustsScrollViewInsets = false } tb.separatorStyle = UITableViewCell.SeparatorStyle.none tb.tableHeaderView = UIView() tb.tableFooterView = UIView() tb.tag = type.rawValue tb.dataSource = self tb.delegate = self tb.rowHeight = 44 var frame = tb.frame switch type { case .build: frame.origin.x = 0 case .floor: frame.origin.x = KSCREENWIDTH case .room: frame.origin.x = KSCREENWIDTH * 2 } tb.frame = frame return tb } } extension IHRoomPicker : UITableViewDataSource,UITableViewDelegate { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 44.0 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let type = TableViewType(rawValue: tableView.tag)! switch type { case .build: return builds.count case .floor: return floors.count case .room: return rooms.count } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let type = TableViewType(rawValue: tableView.tag)! switch type { case .build: let cell = tableView.dequeueReusableCell(withIdentifier: buildCellId, for: indexPath) as! IHSelectedRoomCell cell.nameLabel?.text = builds[indexPath.row].name return cell case .floor: let cell = tableView.dequeueReusableCell(withIdentifier: floorCellId, for: indexPath) as! IHSelectedRoomCell cell.nameLabel?.text = floors[indexPath.row].name return cell case .room: let cell = tableView.dequeueReusableCell(withIdentifier: roomCellId, for: indexPath) as! IHSelectedRoomCell if rooms.count > 0 { cell.nameLabel?.text = rooms[indexPath.row].number } return cell } } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let type = TableViewType(rawValue: tableView.tag)! switch type { case .build: if let buildSelIndexPath = buildSelIndexPath { if buildSelIndexPath != indexPath { floorSelIndexPath = nil roomSeIndexPath = nil } } buildSelIndexPath = indexPath self.sel_build = self.builds[indexPath.row].name! IHLoginService.share.getFloorList(self.builds[indexPath.row].id!, requstSuccess: { (floorlist) in self.floors = floorlist self.scrollView.contentSize = CGSize(width: KSCREENWIDTH * 2, height: self.scrollViewHeight) self.floor_tb?.reloadData() self.scrollView.setContentOffset(CGPoint(x: KSCREENWIDTH, y: 0), animated: true) }) { } case .floor: if let floorSelIndexPath = floorSelIndexPath { if floorSelIndexPath != indexPath { roomSeIndexPath = nil } } floorSelIndexPath = indexPath self.sel_floor = self.floors[indexPath.row].name! IHLoginService.share.getRoomList(self.floors[indexPath.row].id!, requstSuccess: { (roomlist) in self.rooms = roomlist // if self.rooms.count > 0 { self.scrollView.contentSize = CGSize(width: KSCREENWIDTH * 3, height: self.scrollViewHeight) self.room_tb?.reloadData() self.scrollView.setContentOffset(CGPoint(x: KSCREENWIDTH * 2, y: 0), animated: true) // } else { // // } }) { } case .room: roomSeIndexPath = indexPath sel_room = rooms[indexPath.row].number! log.debug("room - \(sel_room)") selectedRoomCompleted?(sel_build, sel_floor, sel_room,rooms[indexPath.row].id!) dismiss() } } } extension IHRoomPicker:UIScrollViewDelegate{ func scrollViewDidScroll(_ scrollView: UIScrollView) { if scrollView.tag != 0 { return } _ = buttons.map { $0.isSelected = false } if scrollView.contentOffset.x == 0 { buildButton.isSelected = true } if scrollView.contentOffset.x == KSCREENWIDTH { floorButton.isSelected = true } if scrollView.contentOffset.x == KSCREENWIDTH * 2 { roomButton.isSelected = true } } } extension IHRoomPicker { override func updateViewConstraints() { super.updateViewConstraints() self.scrollViewHeightConstaint.constant = scrollViewHeight } }