IHClassRoomView.swift 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142
  1. //
  2. // IHClassRoomView.swift
  3. // Inhealth
  4. //
  5. // Created by weclouds on 2020/6/12.
  6. // Copyright © 2020 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. protocol IHClassRoomViewDelegate : NSObjectProtocol{
  10. //调色温与亮度
  11. // func clickLight(_index : Int)
  12. func clickLight(lightDevice : ShoolDeviceList)
  13. //更换灯的位置
  14. func chargeLight(lists: [ShoolDeviceList])
  15. //窗帘的开关
  16. func curtainSetOnOff(curtainDevice : ShoolDeviceList,respone:@escaping ((_ msg : String)->Void))
  17. //色温 3000 - 6000 ,间隔是300
  18. func setClassLightColor(classDevices : [ShoolDeviceList])
  19. //所有灯的开关 -- 模式类型(1 全开模式,2 全关模式,3 投影模式,4 自习模式,5 板书模式)
  20. func lights_set_off(type : String)
  21. }
  22. class IHClassRoomView: UIView {
  23. //上课模型数组
  24. var classModelArr = [UIView]()
  25. var lightsArr = [UIView]()
  26. var blackboardLights = [UIView]()
  27. var allLightsBtn : UIButton?
  28. var cancelBtn : UIButton?
  29. var sureBtn : UIButton?
  30. private var classImage : UIImageView?
  31. var blackboardLine : UIImageView?
  32. private var line : UIImageView?
  33. var moveLight : UIView?
  34. var isLongTap : Bool = false
  35. var isBlackboardLongTap : Bool = false
  36. var clickImage : UIView?
  37. var beginPoint = CGPoint.init(x: 0, y: 0)
  38. var originalPoint = CGPoint.init(x: 0, y: 0)
  39. var isChangeLight : Bool = false
  40. var recordLights = [[UIView : CGPoint]]()
  41. weak var delegate : IHClassRoomViewDelegate?
  42. private var classLightArr = [ShoolDeviceList]()
  43. private var blackBoardLightArr = [ShoolDeviceList]()
  44. private var curtainArr = [ShoolDeviceList]()
  45. var selectBtnIndex : Int = 0
  46. //var oldSelectBtnIndex : Int = 0
  47. var isSuccess : Bool = false
  48. var isAllLightOpen : Bool = false
  49. var isSelect : Bool = false
  50. var blackBoardLightFrames : [(x : CGFloat,y :CGFloat,w : CGFloat,h : CGFloat)]? //黑板灯的位置
  51. var classRoomLightFrames : [(x : CGFloat,y :CGFloat,w : CGFloat,h : CGFloat)]? //教室灯的位置
  52. //数据 - 教室设备
  53. var shoolDivListArr : [ShoolDeviceList]? {
  54. didSet{
  55. if classImage == nil {
  56. createUI()
  57. }else{
  58. classModelArr.removeAll()
  59. lightsArr.removeAll()
  60. blackboardLights.removeAll()
  61. blackBoardLightFrames?.removeAll()
  62. classRoomLightFrames?.removeAll()
  63. allLightsBtn = nil
  64. cancelBtn = nil
  65. sureBtn = nil
  66. classImage = nil
  67. blackboardLine = nil
  68. line = nil
  69. moveLight = nil
  70. isLongTap = false
  71. isBlackboardLongTap = false
  72. clickImage = nil
  73. beginPoint = CGPoint.init(x: 0, y: 0)
  74. originalPoint = CGPoint.init(x: 0, y: 0)
  75. isChangeLight = false
  76. recordLights = [[UIView : CGPoint]]()
  77. self.removeSubviews()
  78. classLightArr.removeAll()
  79. blackBoardLightArr.removeAll()
  80. curtainArr.removeAll()
  81. createUI()
  82. }
  83. }
  84. }
  85. override init(frame: CGRect) {
  86. super.init(frame: frame)
  87. // createUI()
  88. }
  89. required init?(coder: NSCoder) {
  90. fatalError("init(coder:) has not been implemented")
  91. }
  92. }
  93. extension IHClassRoomView{
  94. func createUI() {
  95. //设置大图片
  96. let backImageView = UIImageView.init(frame: self.bounds)
  97. backImageView.image = UIImage.init(named: "背景")
  98. self.addSubview(backImageView)
  99. //教室背景图片
  100. classImage = UIImageView.init()
  101. let percent = (21 * KSCREENWIDTH) / 750
  102. classImage!.frame = CGRect.init(x: percent, y: KNavBarHeight + 20, width: KSCREENWIDTH - 2 * percent, height: KSCREENHEIGHT - KNavBarHeight - 20)
  103. classImage!.image = UIImage.init(named: "教室背景")
  104. classImage!.isUserInteractionEnabled = true
  105. self.addSubview(classImage!)
  106. guard let deviceLists = self.shoolDivListArr else {return }
  107. for light in deviceLists {
  108. //设备类型(4 教室灯,5 黑板灯,6 窗帘)
  109. guard let type = light.type else { return}
  110. if type == "4" {
  111. classLightArr.append(light)
  112. }
  113. if type == "5" {
  114. blackBoardLightArr.append(light)
  115. }
  116. if type == "6" {
  117. curtainArr.append(light)
  118. }
  119. }
  120. //教室灯
  121. setClassLight(lights : classLightArr)
  122. //黑板灯
  123. setBlackBoardLightLocation(lights : blackBoardLightArr)
  124. // 窗帘
  125. setCurtain(curtains :curtainArr )
  126. //开关与色温
  127. setOnOffAndColTep()
  128. //上课模式
  129. setClassModelUI()
  130. }
  131. //设置上课模式
  132. func setClassModel(classModelView_super : UIView) {
  133. let offsetX = (40 * KSCREENWIDTH) / 750
  134. let width = (78 * KSCREENWIDTH) / 750
  135. let between = (classModelView_super.size.width - offsetX * 2 - width * 6) / 5
  136. let arr = ["上课","下课","午休","投影","自习","板书"]
  137. for i in (0..<6) {
  138. let backView = UIView.init(frame: CGRect.init(x: offsetX + CGFloat(i) * (width + between), y: 1, width: width, height: classModelView_super.size.height - 1))
  139. backView.tag = i + 1
  140. let line = UIView.init(frame: CGRect.init(x: 0, y: 0, width: width, height: 1))
  141. line.backgroundColor = UIColor.init(hexString: "#3E328B")
  142. let btn = UIButton.init(frame: CGRect.init(x: 0, y: 1, width: width, height: backView.size.height))
  143. //btn.setImage(UIImage.init(named: "勾选"), for: .normal)
  144. btn.titleLabel?.font = UIFont.systemFont(ofSize: 14)
  145. btn.setTitle(arr[i], for: .normal)
  146. btn.setTitleColor(.black, for: .normal)
  147. btn.isUserInteractionEnabled = false
  148. line.tag = tag + 1
  149. btn.tag = tag + 1
  150. backView.addSubview(line)
  151. backView.addSubview(btn)
  152. let tapGR = UITapGestureRecognizer.init(target: self, action: #selector(changeClassModel))
  153. backView.addGestureRecognizer(tapGR)
  154. classModelView_super.addSubview(backView)
  155. line.backgroundColor = .white
  156. //btn.setImage(UIImage.init(named: ""), for: .normal)
  157. if selectBtnIndex != 0 {
  158. if i + 1 == selectBtnIndex {
  159. line.backgroundColor = UIColor.init(hexString: "#3E328B")
  160. btn.setImage(UIImage.init(named: "勾选"), for: .normal)
  161. }
  162. }
  163. btn.setTitleColor(UIColor.init(hexString: "#657085"), for: .normal)
  164. classModelArr.append(backView)
  165. }
  166. }
  167. //面板灯
  168. func setLightUI(light : ShoolDeviceList,offsetX : CGFloat,offsetY : CGFloat,backW : CGFloat,backH: CGFloat, lightW: CGFloat,lightH: CGFloat,light_superView: UIView){
  169. guard let location = light.location else {
  170. return
  171. }
  172. guard let locationValue = Int(location) else{return}
  173. let row : Int = (locationValue - 1) % 3
  174. let col : Int = (locationValue - 1) / 3
  175. let marginX = offsetX + CGFloat(row) * backW
  176. let marginY = offsetY + CGFloat(col) * backH
  177. //let X = String.init(format: "%.3f",marginX).cgFloat()
  178. let backLightView = UIView.init(frame: CGRect.init(x: Double(marginX), y: Double(marginY), width: Double(backW), height: Double(backH)))
  179. // let backLightView = UIView(frame: CGRect.init(x: marginX, y: marginY, width: backW, height: backH))
  180. //灯
  181. let x = (backW - lightW) * 0.5
  182. let lightImageView = UIImageView.init(frame: CGRect.init(x: x, y: 0, width: lightW, height: lightH))
  183. guard let status = light.status else {
  184. return
  185. }
  186. if status == "0" {
  187. lightImageView.image = UIImage.init(named: "大灯_暗")
  188. }else{
  189. lightImageView.image = UIImage.init(named: "大灯_亮")
  190. }
  191. lightImageView.isUserInteractionEnabled = true
  192. backLightView.tag = locationValue
  193. lightImageView.tag = locationValue
  194. //标签
  195. let lightLabel = UILabel.init(frame: CGRect.init(x: 0, y: lightH - 20, width: backW, height: backH - lightH + 10))
  196. lightLabel.text = light.name
  197. lightLabel.textAlignment = .center
  198. lightLabel.textColor = .white
  199. lightLabel.font = UIFont.systemFont(ofSize: 12)
  200. lightLabel.isHidden = true
  201. self.clickImage = backLightView
  202. //手势
  203. let tapGR = UITapGestureRecognizer.init(target: self, action: #selector(tapImage))
  204. let longGR = UILongPressGestureRecognizer.init(target: self, action: #selector(longTapImage))
  205. // backLightView.addGestureRecognizer(tapGR)
  206. // backLightView.addGestureRecognizer(longGR)
  207. lightImageView.addGestureRecognizer(tapGR)
  208. lightImageView.addGestureRecognizer(longGR)
  209. // light_superView.isUserInteractionEnabled = true
  210. backLightView.addSubview(lightImageView)
  211. backLightView.addSubview(lightLabel)
  212. light_superView.addSubview(backLightView)
  213. lightsArr.append(backLightView)
  214. }
  215. //设置窗帘
  216. func setCurtainUI(curtain : ShoolDeviceList, curtain_superView : UIView) {
  217. //
  218. guard let location = curtain.location else {
  219. return
  220. }
  221. let curtain_offsetY = ((134 + 290) * KSCREENHEIGHT) / 1623
  222. var offsetY : CGFloat = 0
  223. if location == "2" {
  224. offsetY = curtain_offsetY
  225. }
  226. let curtainH = (290 * KSCREENHEIGHT) / 1623
  227. let curtainBtn = UIButton.init(frame: CGRect.init(x: 0, y: offsetY, width: 30, height: curtainH))
  228. guard let status = curtain.status else {
  229. return
  230. }
  231. if status == "1" {
  232. //开
  233. curtainBtn.setImage(UIImage.init(named: "窗帘打开"), for: .normal)
  234. }else{
  235. //关
  236. curtainBtn.setImage(UIImage.init(named: "窗帘关闭"), for: .normal)
  237. }
  238. guard let tag : Int = Int(location) else {
  239. return
  240. }
  241. curtainBtn.tag = tag
  242. curtainBtn.addTarget(self, action: #selector(switchCurtain), for: .touchUpInside)
  243. curtain_superView.addSubview(curtainBtn)
  244. }
  245. }
  246. extension IHClassRoomView{
  247. //黑板灯-点击
  248. @objc func blackboardTapImage(tapGR : UIGestureRecognizer){
  249. let imageV = tapGR.view!
  250. log.debug("黑板-开关\(imageV.tag)")
  251. //教室灯长按之后,这里不允许进来
  252. if isLongTap == true {
  253. return
  254. }
  255. guard let delegate = self.delegate else{
  256. return
  257. }
  258. for light in blackBoardLightArr {
  259. guard let location = light.location else {
  260. return
  261. }
  262. if location == String.init(format: "%d", imageV.tag){
  263. delegate.clickLight(lightDevice: light)
  264. break
  265. }
  266. }
  267. //更改
  268. // delegate.clickLight(_index: imageV.tag)
  269. }
  270. //黑板灯-长按
  271. @objc func blackboardTLongTapImage(longTapGR : UIGestureRecognizer){
  272. log.debug("长按灯了")
  273. if longTapGR.state == .began {
  274. for lightV in blackboardLights {
  275. lightV.isUserInteractionEnabled = false
  276. let dic = [lightV : lightV.frame.origin]
  277. recordLights.append(dic)
  278. for label in lightV.subviews {
  279. if label.isKind(of: UILabel.self) {
  280. label.isHidden = false
  281. }
  282. }
  283. }
  284. setLightRotation(lights: blackboardLights)
  285. isBlackboardLongTap = true
  286. //在黑板上盖一个
  287. guard let coverView = line else {
  288. return
  289. }
  290. let blackview = UIView.init(frame: coverView.frame)
  291. blackview.tag = 100
  292. blackview.backgroundColor = .clear
  293. classImage?.addSubview(blackview)
  294. }
  295. }
  296. //窗帘开关
  297. @objc func switchCurtain(btn: UIButton){
  298. log.debug("窗帘开关\(btn.tag)")
  299. // btn.isSelected = !btn.isSelected
  300. if isBlackboardLongTap == true || isLongTap == true{
  301. return
  302. }
  303. guard let delegate = delegate else {
  304. return
  305. }
  306. for curtain in curtainArr {
  307. guard let location = curtain.location else {
  308. return
  309. }
  310. if location == String.init(format: "%d", btn.tag){
  311. delegate.curtainSetOnOff(curtainDevice: curtain, respone: { msg in
  312. if msg == "successful operation"{
  313. //重新加载新的数据
  314. }
  315. })
  316. }
  317. }
  318. }
  319. //面板灯开关
  320. @objc func tapImage(tapGR : UIGestureRecognizer){
  321. let imageV = tapGR.view!
  322. log.debug("面板灯-开关\(imageV.tag)")
  323. //黑板在移动里时,这里不允许点击
  324. if isBlackboardLongTap == true {
  325. return
  326. }
  327. guard let delegate = self.delegate else{
  328. return
  329. }
  330. for light in classLightArr {
  331. guard let location = light.location else {
  332. return
  333. }
  334. if location == String.init(format: "%d", imageV.tag){
  335. delegate.clickLight(lightDevice: light)
  336. break
  337. }
  338. }
  339. // delegate.clickLight(_index: imageV.tag)
  340. }
  341. //面板灯长按
  342. @objc func longTapImage(longGR : UIGestureRecognizer){
  343. if longGR.state == .began {
  344. for lightV in lightsArr {
  345. lightV.isUserInteractionEnabled = false
  346. let dic = [lightV : lightV.frame.origin]
  347. recordLights.append(dic)
  348. for label in lightV.subviews {
  349. if label.isKind(of: UILabel.self) {
  350. label.isHidden = false
  351. }
  352. }
  353. }
  354. setLightRotation(lights: lightsArr)
  355. isLongTap = true
  356. //在黑板上盖一个
  357. guard let coverView = blackboardLine else {
  358. return
  359. }
  360. let blackview = UIView.init(frame: coverView.frame)
  361. blackview.tag = 100
  362. blackview.backgroundColor = .clear
  363. classImage?.addSubview(blackview)
  364. }
  365. }
  366. //设置抖动
  367. func setLightRotation(lights : [UIView]) {
  368. let anim = CAKeyframeAnimation.init()
  369. anim.keyPath = "transform.rotation"
  370. //弧度转角度
  371. let s = 4 / 180.0 * Double.pi
  372. // anim.values = [-s,0,s,0,-s,0,s,0]
  373. anim.values = [-s,s,-s]
  374. anim.repeatCount = MAXFLOAT
  375. anim.duration = 0.2
  376. for lightView in lights {
  377. let views = lightView.subviews
  378. for subV in views {
  379. if subV.isKind(of: UIImageView.self) && subV.tag > 0 {
  380. subV.isUserInteractionEnabled = false
  381. subV.layer.add(anim, forKey: nil)
  382. }
  383. }
  384. }
  385. //隐藏-开关
  386. allLightsBtn?.isHidden = true
  387. classModelArr[0].superview?.isHidden = true
  388. //显示--选中与取消 -- 注意
  389. if blackboardLine != nil {
  390. blackboardLine!.isHidden = false
  391. }
  392. if line != nil{
  393. line!.isHidden = false
  394. }
  395. cancelBtn?.isHidden = false
  396. sureBtn?.isHidden = false
  397. }
  398. //色温
  399. @objc func changeColorTemp(tapGR : UIGestureRecognizer){
  400. log.debug("色温")
  401. guard let delegate = delegate else {
  402. return
  403. }
  404. //教室灯循环请求,全部返回后再点击发命令
  405. delegate.setClassLightColor(classDevices: classLightArr)
  406. }
  407. //所有灯的开关
  408. @objc func switchAll(btn : UIButton){
  409. log.debug("所有灯的开关")
  410. btn.isSelected = !btn.isSelected
  411. //先要判断灯的状态
  412. guard let delegate = delegate else {
  413. return
  414. }
  415. //灯的全开/全关
  416. isSelect = !isSelect
  417. if isSelect == true {
  418. delegate.lights_set_off(type: "1")
  419. }else{
  420. delegate.lights_set_off(type: "2")
  421. }
  422. }
  423. func setLightModel(blackboardLight : UIView, lightName : String) {
  424. for imageV in blackboardLight.subviews {
  425. if imageV.isKind(of: UIImageView.self) && imageV.tag > 0{
  426. // imageV.isHighlighted = true
  427. let imageV = imageV as! UIImageView
  428. imageV.image = UIImage.init(named: lightName)
  429. }
  430. }
  431. }
  432. //改变上课模式
  433. @objc func changeClassModel(tapGR : UIGestureRecognizer){
  434. let view = tapGR.view!
  435. log.debug("模式:\(view.tag)")
  436. UIView.animate(withDuration: 0.3) {
  437. for subView in self.classModelArr {
  438. if view.tag == subView.tag {
  439. for v in subView.subviews {
  440. if(v.tag > 0){
  441. if v.isMember(of: UIButton.self) {
  442. let btn :UIButton = v as! UIButton
  443. btn.setImage(UIImage.init(named: "勾选"), for: .normal)
  444. btn.setTitleColor(.black, for: .normal)
  445. }else{
  446. v.backgroundColor = UIColor.init(hexString: "#3E328B")
  447. }
  448. }
  449. }
  450. }else if subView.tag > 0 && view.tag != subView.tag {
  451. for v in subView.subviews {
  452. if(v.tag > 0){
  453. if v.isMember(of: UIButton.self) {
  454. let btn :UIButton = v as! UIButton
  455. //btn.setImage(UIImage.init(named: ""), for: .normal)
  456. btn.setTitleColor(UIColor.init(hexString: "#657085"), for: .normal)
  457. }else{
  458. v.backgroundColor = .white
  459. }
  460. }
  461. }
  462. }
  463. }
  464. }
  465. guard let delegate = delegate else {
  466. return
  467. }
  468. // 模式类型(1 全开模式,2 全关模式,3 投影模式,4 自习模式,5 板书模式,7 上课模式,8 下课模式,9 午休模式)
  469. //1-7 2-8 3-9 4-3 5-4 6-5
  470. var type = "1"
  471. if view.tag == 1 {
  472. type = "7"
  473. }
  474. if view.tag == 2 {
  475. type = "8"
  476. }
  477. if view.tag == 3 {
  478. type = "9"
  479. }
  480. if view.tag == 4 {
  481. type = "3"
  482. }
  483. if view.tag == 5 {
  484. type = "4"
  485. }
  486. if view.tag == 6 {
  487. type = "5"
  488. }
  489. selectBtnIndex = view.tag
  490. delegate.lights_set_off(type: type)
  491. }
  492. @objc func cancelChooseClass(btn: UIButton){
  493. //取消选中教室 - 面板灯又回到原来的位置
  494. if isLongTap == true{
  495. var arr = [UIView]()
  496. for dic in recordLights {
  497. let key = dic.keys.first
  498. let value = dic.values.first
  499. key!.frame.origin = value!
  500. arr.append(key!)
  501. }
  502. lightsArr = arr
  503. //取消黑板灯的蒙板
  504. let coverView = classImage?.viewWithTag(100)
  505. coverView?.removeFromSuperview()
  506. }
  507. if isBlackboardLongTap == true {
  508. var arr = [UIView]()
  509. for dic in recordLights {
  510. let key = dic.keys.first
  511. let value = dic.values.first
  512. key!.frame.origin = value!
  513. arr.append(key!)
  514. }
  515. blackboardLights = arr
  516. //取消教室灯的蒙板
  517. let coverView = classImage?.viewWithTag(100)
  518. coverView?.removeFromSuperview()
  519. }
  520. setBottomState()
  521. }
  522. @objc func chooseClass(btn: UIButton){
  523. guard let delegate = delegate else { return }
  524. //更换 -- 灯的位置
  525. var lights = [ShoolDeviceList]()
  526. if isBlackboardLongTap == true {
  527. //黑板灯
  528. // originBlackBoardTagArr
  529. //原来的位置与改变后的位置相比
  530. for (idx,changeLocation) in blackboardLights.enumerated() {
  531. var light = blackBoardLightArr[idx]
  532. guard let loc = light.location else {
  533. return
  534. }
  535. guard let locValue = Int(loc) else {
  536. return
  537. }
  538. if changeLocation.tag != locValue{
  539. light.location = String.init(format: "%d", changeLocation.tag)
  540. lights.append(light)
  541. }
  542. }
  543. }
  544. if isLongTap == true {
  545. //教室灯
  546. //原来的位置与改变后的位置相比
  547. for (idx,changeLocation) in lightsArr.enumerated() {
  548. var light = classLightArr[idx]
  549. guard let loc = light.location else {
  550. return
  551. }
  552. guard let locValue = Int(loc) else {
  553. return
  554. }
  555. // if changeLocation.tag == locValue{
  556. // return
  557. // }
  558. if changeLocation.tag != locValue{
  559. light.location = String.init(format: "%d", changeLocation.tag)
  560. lights.append(light)
  561. }
  562. }
  563. }
  564. delegate.chargeLight(lists: lights)
  565. //选中教室
  566. setBottomState()
  567. }
  568. func setBottomState(){
  569. //取消教室灯的蒙板
  570. let coverView = classImage?.viewWithTag(100)
  571. coverView?.removeFromSuperview()
  572. if(isLongTap == true){
  573. for lightV in lightsArr {
  574. lightV.isUserInteractionEnabled = true
  575. for imageView in lightV.subviews {
  576. if imageView.isKind(of: UIImageView.self) && imageView.tag > 0 {
  577. imageView.isUserInteractionEnabled = true
  578. imageView.layer.removeAllAnimations()
  579. }
  580. if imageView.isKind(of: UILabel.self) {
  581. imageView.isHidden = true
  582. }
  583. }
  584. }
  585. }
  586. if(isBlackboardLongTap == true){
  587. for lightV in blackboardLights {
  588. lightV.isUserInteractionEnabled = true
  589. for imageView in lightV.subviews {
  590. if imageView.isKind(of: UIImageView.self) && imageView.tag > 0 {
  591. imageView.isUserInteractionEnabled = true
  592. imageView.layer.removeAllAnimations()
  593. }
  594. if imageView.isKind(of: UILabel.self) {
  595. imageView.isHidden = true
  596. }
  597. }
  598. }
  599. }
  600. // --- 注意
  601. if blackboardLine != nil {
  602. blackboardLine!.isHidden = true
  603. }
  604. if line != nil {
  605. line!.isHidden = true
  606. }
  607. cancelBtn?.isHidden = true
  608. sureBtn?.isHidden = true
  609. allLightsBtn?.isHidden = false
  610. classModelArr[0].superview?.isHidden = false
  611. isLongTap = false
  612. isBlackboardLongTap = false
  613. }
  614. }
  615. //上课模式
  616. extension IHClassRoomView{
  617. func setClassModelUI() {
  618. //上课模式
  619. let classY = (1321 * KSCREENHEIGHT) / 1623
  620. let classH = (82 * KSCREENHEIGHT) / 1623
  621. let classModelView = UIView.init(frame: CGRect.init(x: 0, y: classY, width: classImage!.size.width, height: classH))
  622. classModelView.backgroundColor = .white
  623. classModelView.cornerRadius = 8
  624. classModelView.layer.masksToBounds = true
  625. classImage!.addSubview(classModelView)
  626. setClassModel(classModelView_super: classModelView)
  627. //选中界面下的 x和v
  628. let btnX = (254 * KSCREENWIDTH) / 750
  629. let btnY = (1311 * KSCREENHEIGHT) / 1623
  630. let btnWH = (60 * KSCREENWIDTH) / 750
  631. cancelBtn = UIButton.init(frame: CGRect.init(x: btnX, y: btnY, width: btnWH, height: btnWH))
  632. cancelBtn?.setImage(UIImage.init(named: "取消"), for: .normal)
  633. cancelBtn?.backgroundColor = UIColor.init(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 0.7)
  634. cancelBtn?.addTarget(self, action: #selector(cancelChooseClass), for: .touchUpInside)
  635. cancelBtn?.cornerRadius = btnWH / 2
  636. cancelBtn?.layer.masksToBounds = true
  637. cancelBtn?.isHidden = true
  638. classImage!.addSubview(cancelBtn!)
  639. let sbtnX = (394 * KSCREENWIDTH) / 750
  640. sureBtn = UIButton.init(frame: CGRect.init(x: sbtnX, y: btnY, width: btnWH, height: btnWH))
  641. sureBtn?.setImage(UIImage.init(named: "确认"), for: .normal)
  642. sureBtn?.backgroundColor = UIColor.init(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 0.7)
  643. sureBtn?.addTarget(self, action: #selector(chooseClass), for: .touchUpInside)
  644. sureBtn?.isHidden = true
  645. sureBtn?.cornerRadius = btnWH / 2
  646. sureBtn?.layer.masksToBounds = true
  647. classImage!.addSubview(sureBtn!)
  648. }
  649. }
  650. //开关与色温
  651. extension IHClassRoomView{
  652. func setOnOffAndColTep() {
  653. //所有灯的开关
  654. let lightsX = (19 * KSCREENWIDTH) / 750
  655. let lightsY = (1221 * KSCREENHEIGHT) / 1623
  656. let lightsW = (70 * KSCREENWIDTH) / 750
  657. allLightsBtn = UIButton.init(frame: CGRect.init(x: lightsX, y: lightsY, width: lightsW, height: lightsW))
  658. allLightsBtn?.isSelected = isSelect
  659. if isSelect == false{
  660. allLightsBtn?.setBackgroundImage(UIImage.init(named: "全关"), for: .normal)
  661. allLightsBtn?.setBackgroundImage(UIImage.init(named: "全开"), for: .selected)
  662. }else{
  663. allLightsBtn?.setBackgroundImage(UIImage.init(named: "全开"), for: .normal)
  664. allLightsBtn?.setBackgroundImage(UIImage.init(named: "全关"), for: .selected)
  665. }
  666. allLightsBtn?.addTarget(self, action: #selector(switchAll), for: .touchUpInside)
  667. classImage!.addSubview(allLightsBtn!)
  668. //色温开关
  669. let tempX = (619 * KSCREENWIDTH) / 750
  670. let tempImageV = UIImageView.init(frame: CGRect.init(x: tempX, y: lightsY, width: lightsW, height: lightsW))
  671. tempImageV.image = UIImage.init(named: "色温_开关")
  672. let tapGR = UITapGestureRecognizer.init(target: self, action: #selector(changeColorTemp))
  673. tempImageV.addGestureRecognizer(tapGR)
  674. tempImageV.isUserInteractionEnabled = true
  675. //暂时取消
  676. //classImage.addSubview(tempImageV)
  677. }
  678. }
  679. //教室灯
  680. extension IHClassRoomView{
  681. func setClassLight(lights : [ShoolDeviceList]){
  682. if lights.count == 0 {
  683. return
  684. }
  685. //面板灯的网格线
  686. let lineX = (49 * KSCREENWIDTH) / 750
  687. let lineY = (222 * KSCREENHEIGHT) / 1623
  688. let lineH = (1029 * KSCREENHEIGHT) / 1623
  689. line = UIImageView.init(frame: CGRect.init(x: lineX, y: lineY, width: classImage!.size.width - 2 * lineX, height: lineH))
  690. line!.image = UIImage.init(named: "3-3网格")
  691. line!.isHidden = true
  692. classImage!.addSubview(line!)
  693. //面板灯222
  694. let offsetY = (202 * KSCREENHEIGHT) / 1623
  695. let offsetX = (49 * KSCREENWIDTH) / 750
  696. let backW = ((708 - 49 * 2) / 3 * KSCREENWIDTH) / 750
  697. let backH = ((1029 * KSCREENHEIGHT) / 1623) / 3
  698. let lightW : CGFloat = (120 * KSCREENWIDTH) / 750
  699. let lightH = (306 * KSCREENHEIGHT) / 1623
  700. //计算所有按键的位置
  701. setAllClassRoomLightFrame(offsetX: offsetX, offsetY: offsetY, backW: backW, backH: backH)
  702. for light in lights {
  703. setLightUI(light : light,offsetX : offsetX, offsetY : offsetY, backW : backW,backH: backH, lightW: lightW,lightH: lightH,light_superView: classImage!)
  704. }
  705. }
  706. }
  707. //计算所有的灯的位置
  708. extension IHClassRoomView {
  709. //设置教室灯的位置
  710. private func setAllClassRoomLightFrame (offsetX : CGFloat, offsetY : CGFloat, backW : CGFloat,backH: CGFloat){
  711. var frames = [(x:CGFloat,y:CGFloat,w:CGFloat,h:CGFloat)]()
  712. for i in 0..<9 {
  713. let row : Int = i % 3
  714. let col : Int = i / 3
  715. let marginX = offsetX + CGFloat(row) * backW
  716. let marginY = offsetY + CGFloat(col) * backH
  717. let X = String.init(format: "%.3f", marginX).cgFloat()
  718. frames.append((x: X!, y: marginY, w: backW, h: backH))
  719. }
  720. classRoomLightFrames = frames
  721. }
  722. private func setBlackBoardLightFrames(width: CGFloat,height : CGFloat) {
  723. var frames = [(x:CGFloat,y:CGFloat,w:CGFloat,h:CGFloat)]()
  724. for i in 0..<3 {
  725. var offsetX : CGFloat = 102
  726. offsetX = offsetX + width * CGFloat(i)
  727. let light_percent = (offsetX * KSCREENWIDTH) / 750
  728. let width = (width * KSCREENWIDTH) / 750
  729. let X = String.init(format: "%.3f", light_percent).cgFloat()
  730. frames.append((x : X!, y: 0, w : width, h : height))
  731. }
  732. blackBoardLightFrames = frames
  733. }
  734. }
  735. //窗帘
  736. extension IHClassRoomView{
  737. func setCurtain(curtains : [ShoolDeviceList]) {
  738. if curtains.count > 0 {
  739. //窗帘 360
  740. let curtain_percent = (360 * KSCREENHEIGHT) / 1623
  741. let height = ((290 * 2 + 134) * KSCREENHEIGHT) / 1623
  742. let curtainView = UIView.init(frame: CGRect.init(x: 0, y: curtain_percent, width: 44, height: height))
  743. curtainView.backgroundColor = .clear
  744. classImage!.addSubview(curtainView)
  745. for curtain in curtains {
  746. setCurtainUI(curtain : curtain, curtain_superView: curtainView)
  747. }
  748. }
  749. }
  750. }
  751. //黑板灯
  752. extension IHClassRoomView {
  753. func setBlackBoardLightLocation(lights : [ShoolDeviceList]) {
  754. if lights.count == 0 {
  755. return
  756. }
  757. //黑板灯的网格线
  758. let blackboardLineX = (102 * KSCREENWIDTH) / 750
  759. let blackboardLineH = (136 * KSCREENHEIGHT) / 1623
  760. blackboardLine = UIImageView.init(frame: CGRect.init(x: blackboardLineX, y: 0, width: classImage!.size.width - 2 * blackboardLineX, height: blackboardLineH))
  761. blackboardLine!.image = UIImage.init(named: "1-3网格")
  762. blackboardLine!.isHidden = true
  763. classImage!.addSubview(blackboardLine!)
  764. let w : CGFloat = (708 - 102 * 2) / 3
  765. //计算所有的黑板灯的位置
  766. setBlackBoardLightFrames(width: w,height : blackboardLineH)
  767. for light in lights {
  768. //改
  769. setBlackBoardLight(light : light,width: w,height : blackboardLineH,blackBoardLight_superView: classImage!)
  770. }
  771. }
  772. //设置黑板灯
  773. func setBlackBoardLight(light : ShoolDeviceList,width: CGFloat,height : CGFloat, blackBoardLight_superView : UIView) {
  774. guard let location = light.location else {
  775. return
  776. }
  777. var offsetX : CGFloat = 102
  778. if location == "2" {
  779. offsetX = offsetX + width
  780. }
  781. if location == "3" {
  782. offsetX = offsetX + width * 2
  783. }
  784. let light_percent = (offsetX * KSCREENWIDTH) / 750
  785. let width = (width * KSCREENWIDTH) / 750
  786. //let blackboardView = UIView.init(frame: CGRect.init(x: light_percent, y: 0, width: width, height: height))
  787. let X = String.init(format: "%.3f",light_percent).cgFloat()
  788. let blackboardView = UIView.init(frame: CGRect.init(x: X!, y: 0, width: width, height: height))
  789. //灯
  790. guard let status = light.status else {
  791. return
  792. }
  793. let blackboard_light = UIImageView.init()
  794. if status == "0" {
  795. blackboard_light.image = UIImage.init(named: "黑板灯_暗")
  796. }else{
  797. blackboard_light.image = UIImage.init(named: "黑板灯_亮")
  798. }
  799. blackboard_light.sizeToFit()
  800. blackboard_light.frame.origin = CGPoint.init(x: (blackboardView.frame.size.width - blackboard_light.frame.size.width) * 0.5, y: -10)
  801. guard let tag = Int(location) else {
  802. return
  803. }
  804. blackboardView.tag = tag
  805. blackboard_light.tag = tag
  806. //标签
  807. let blackboardLabel = UILabel.init(frame: CGRect.init(x: 0, y: 30, width: width, height: 34))
  808. // guard let deviceId = light.id else {
  809. // return
  810. // }
  811. // blackboardLabel.text = deviceId
  812. blackboardLabel.text = light.name
  813. blackboardLabel.textColor = .white
  814. blackboardLabel.font = UIFont.systemFont(ofSize: 12)
  815. blackboardLabel.textAlignment = .center
  816. blackboardLabel.isHidden = true
  817. blackboardView.addSubview(blackboard_light)
  818. blackboardView.addSubview(blackboardLabel)
  819. blackBoardLight_superView.addSubview(blackboardView)
  820. //手势
  821. let tapGR = UITapGestureRecognizer.init(target: self, action: #selector(blackboardTapImage))
  822. let longGR = UILongPressGestureRecognizer.init(target: self, action: #selector(blackboardTLongTapImage))
  823. blackboardView.addGestureRecognizer(tapGR)
  824. blackboardView.addGestureRecognizer(longGR)
  825. self.clickImage = blackboardView
  826. blackboardLights.append(blackboardView)
  827. }
  828. }
  829. extension IHClassRoomView {
  830. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  831. //长按之后
  832. if isLongTap == true {
  833. lightTouch(touches: touches, lights: lightsArr)
  834. }
  835. if isBlackboardLongTap == true {
  836. lightTouch(touches: touches, lights: blackboardLights)
  837. }
  838. }
  839. override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
  840. if !beginPoint.equalTo(CGPoint.init(x: 0, y: 0)) {
  841. if isLongTap == true{
  842. lightMove(touches: touches)
  843. }
  844. if isBlackboardLongTap == true {
  845. lightMove(touches: touches)
  846. }
  847. }
  848. }
  849. override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
  850. log.debug("结束--")
  851. if !beginPoint.equalTo(CGPoint.init(x: 0, y: 0)){
  852. if isLongTap == true{
  853. lightEnd(touches: touches, lights: lightsArr)
  854. }
  855. if isBlackboardLongTap == true {
  856. lightEnd(touches: touches, lights: blackboardLights)
  857. }
  858. }
  859. }
  860. //面板灯的 - 点击
  861. func lightTouch(touches: Set<UITouch>,lights : [UIView]){
  862. //遍历所有的面板灯的坐标
  863. for touch:AnyObject in touches {
  864. let touche : UITouch = touch as! UITouch
  865. let point = touche.location(in: classImage)
  866. for lightView in lights {
  867. let bool = lightView.frame.contains(point)
  868. if bool == true {
  869. classImage!.bringSubviewToFront(lightView)
  870. beginPoint = point
  871. moveLight = lightView
  872. originalPoint = lightView.frame.origin
  873. }
  874. }
  875. }
  876. }
  877. //面板灯 - 移动
  878. func lightMove(touches: Set<UITouch>) {
  879. for touch:AnyObject in touches {
  880. let touche : UITouch = touch as! UITouch
  881. let point = touche.location(in: classImage)
  882. let x = point.x - beginPoint.x
  883. let y = point.y - beginPoint.y
  884. guard let moveLight = moveLight else {
  885. return
  886. }
  887. moveLight.center.x = moveLight.center.x + x
  888. moveLight.center.y = moveLight.center.y + y
  889. beginPoint = point
  890. }
  891. }
  892. //灯 - 停止
  893. func lightEnd(touches: Set<UITouch>,lights : [UIView]) {
  894. for touch:AnyObject in touches {
  895. let touche : UITouch = touch as! UITouch
  896. let endPoint = touche.location(in: classImage)
  897. //1.先遍历点是否包含在frame的数组中
  898. //2.1. 如果移动的终点是没有灯的,就直接修改该灯的位置
  899. //2.2. 如果移动的终点是有灯的,就与此灯交换位置
  900. var isContain = false
  901. var contained = false
  902. var lightFrames = [(x : CGFloat,y :CGFloat,w : CGFloat,h : CGFloat)]()
  903. if isLongTap == true {
  904. lightFrames = self.classRoomLightFrames!
  905. }
  906. if isBlackboardLongTap == true {
  907. lightFrames = self.blackBoardLightFrames!
  908. }
  909. for (index,frameTupe) in lightFrames.enumerated() {
  910. let frame = CGRect.init(x: frameTupe.x, y: frameTupe.y, width: frameTupe.w, height: frameTupe.h)
  911. isContain = frame.contains(endPoint)
  912. let frameX = String.init(format: "%.3f", frame.origin.x)
  913. let frameY = String.init(format: "%.3f", frame.origin.y)
  914. //再看是否有可以交换的灯
  915. if isContain == true{
  916. contained = isContain
  917. var ischange = 0
  918. for light in lights {
  919. //&& light.frame != moveLight!.frame
  920. let lightFrameX = String.init(format: "%.3f", light.frame.origin.x)
  921. let lightFrameY = String.init(format: "%.3f", light.frame.origin.y)
  922. //创建view精度会改变,所以把origin取二位做比较
  923. if frameX == lightFrameX && frameY == lightFrameY {
  924. //有交换的灯,但不能交换自己
  925. log.debug("有交换的\(frame),\(light.frame)")
  926. ischange = 1
  927. light.frame.origin = originalPoint
  928. light.tag = moveLight!.tag
  929. moveLight!.frame = frame
  930. moveLight!.tag = index + 1
  931. beginPoint = CGPoint.init(x: 0, y: 0)
  932. break
  933. }
  934. }
  935. if ischange == 0 {
  936. //没有交换的,直接修改位置
  937. log.debug("直接修改位置\(frame)")
  938. moveLight?.tag = index + 1
  939. moveLight?.frame = frame
  940. beginPoint = CGPoint.init(x: 0, y: 0)
  941. break
  942. }
  943. }
  944. }
  945. if isContain == false && contained == false{
  946. //结束点是否在 这些
  947. log.debug("不在classRoomFrame范围内\(frame)")
  948. moveLight?.frame.origin = originalPoint
  949. beginPoint = CGPoint.init(x: 0, y: 0)
  950. break
  951. }
  952. // for lightView in lights{
  953. // let bool = lightView.frame.contains(endPoint)
  954. // log.debug("包含:\(bool),\(lightView)" )
  955. // if bool == true {
  956. //
  957. // if lightView.isEqual(moveLight) {
  958. // //2.如果不挡住就回原来的位置
  959. // lightView.frame.origin = originalPoint
  960. // beginPoint = CGPoint.init(x: 0, y: 0)
  961. // }else{
  962. //
  963. // //1.如果挡住就置换
  964. // let end = lightView.frame.origin
  965. // lightView.frame.origin = originalPoint
  966. // moveLight?.frame.origin = end
  967. //
  968. // //更换location
  969. // let location = lightView.tag
  970. // guard let moveLight = moveLight else {
  971. // return
  972. // }
  973. // lightView.tag = moveLight.tag
  974. // moveLight.tag = location
  975. // beginPoint = CGPoint.init(x: 0, y: 0)
  976. //
  977. // break
  978. // }
  979. // }
  980. // }
  981. }
  982. }
  983. }