IHLampColorView.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. //
  2. // IHLampColorView.swift
  3. // Inhealth
  4. //
  5. // Created by weclouds on 2020/4/20.
  6. // Copyright © 2020 weclouds. All rights reserved.
  7. //
  8. import UIKit
  9. class IHLampColorView: UIView {
  10. //调色结果
  11. var paletteComplition:((ColorStruct)->Void)?
  12. fileprivate var gradientLayer :IHGradientLayer?
  13. @IBOutlet weak var brightnessBtn: UIButton!
  14. @IBOutlet weak var colorValueBtn: UIButton!
  15. @IBOutlet weak var touchView: UIImageView!
  16. @IBOutlet weak var brightThumb: UIImageView!
  17. @IBOutlet weak var colorThumb: UIImageView!
  18. @IBOutlet weak var brightnessPickerView: UIView!
  19. @IBOutlet weak var colorPickerView: IHColorPickerView!
  20. @IBOutlet weak var lampInfoBox: UIView!
  21. var isVerticalMove :Bool! = false // 纵轴移动
  22. {
  23. didSet{
  24. if self.isVerticalMove == true {
  25. self.colorPickerView.isHidden = true
  26. self.colorThumb.isHidden = true
  27. self.brightnessPickerView.isHidden = false
  28. self.brightThumb.isHidden = false
  29. }else {
  30. self.colorPickerView.isHidden = true
  31. self.colorThumb.isHidden = true
  32. self.brightnessPickerView.isHidden = true
  33. self.brightThumb.isHidden = true
  34. }
  35. }
  36. }
  37. var isHorizontalMove :Bool! = false //横轴移动
  38. {
  39. didSet{
  40. if self.isHorizontalMove == true {
  41. self.colorPickerView.isHidden = false
  42. self.colorThumb.isHidden = false
  43. self.brightnessPickerView.isHidden = true
  44. self.brightThumb.isHidden = true
  45. }else {
  46. self.colorPickerView.isHidden = true
  47. self.colorThumb.isHidden = true
  48. self.brightnessPickerView.isHidden = true
  49. self.brightThumb.isHidden = true
  50. }
  51. }
  52. }
  53. var isLock:Bool? = false //加一把锁 保证单独执行
  54. let horizontalSensitivity : CGFloat = 30 //水平灵敏度
  55. let sensitivity : CGFloat = 50 //灵敏度 移动的又有效距离 / sensitivity
  56. let beginY :CGFloat? = (KSCREENHEIGHT - 400 ) / 2
  57. let endY :CGFloat? = (KSCREENHEIGHT - 400 ) / 2 + 400
  58. let colorPickerWidth = KSCREENWIDTH - 80
  59. var beginPoint : CGPoint?
  60. var movePoint : CGPoint?
  61. var isMove:Bool! = false
  62. var finalColor:ColorStruct?
  63. var currentColor:ColorStruct?{
  64. didSet{
  65. if let color = self.currentColor {
  66. let curColor = UIColor(red: color.Red!, green: color.Green!, blue: color.Blue!)
  67. _fill(curColor!) //填充当前颜色
  68. colorValueBtn.setTitle("R:\(color.Red!) G:\(color.Green!) B:\(color.Blue!)", for: .normal)
  69. // self.finalColor = color //赋初值 ,如果没有处理,最后就是这个值
  70. }
  71. }
  72. }
  73. var colors :[CGColor]? = [CGColor](){
  74. didSet{
  75. // self.setNeedsDisplay()
  76. if let colors = self.colors {
  77. drawColor(colors)
  78. }
  79. }
  80. }
  81. var hvalue:CGFloat? = 0{
  82. didSet{
  83. if let hvalue = self.hvalue {
  84. let color = UIColor(hue: hvalue, saturation: 1, brightness: self.brightness ?? 1, alpha: 1)
  85. setViewColor(color)
  86. currentColor(color)
  87. }
  88. }
  89. }
  90. //颜色亮度
  91. var brightness :CGFloat?
  92. var bright : CGFloat?{
  93. didSet{
  94. if let bright = self.bright {
  95. self.brightThumb.center.y = (bright )
  96. let result = (400 - (bright - beginY!) ) / 400 * 100
  97. self.brightnessBtn.setTitle("\(Int(result))%", for: .normal)
  98. self.brightness = result / 100
  99. setColorBrightness(result / 100)
  100. }
  101. }
  102. }
  103. var color : CGFloat?{
  104. didSet{
  105. if let color = self.color {
  106. self.colorThumb.center.x = color
  107. self.hvalue = (color - 40) / colorPickerWidth
  108. }
  109. }
  110. }
  111. override func awakeFromNib() {
  112. super.awakeFromNib()
  113. _fill(UIColor.red)//默认
  114. gradientLayer = IHGradientLayer()
  115. gradientLayer?.frame = self.bounds
  116. self.layer.insertSublayer(gradientLayer!, at: 0)
  117. }
  118. func setupUI() {
  119. brightnessBtn.layoutButton(style: .Left, imageTitleSpace: 10)
  120. colorValueBtn.layoutButton(style: .Left
  121. , imageTitleSpace: 10)
  122. }
  123. override func draw(_ rect: CGRect) {
  124. // colors = [UIColor.white.cgColor,UIColor.blue.cgColor]
  125. // if self.colors?.count == 2 {
  126. // drawColor(self.colors!)
  127. // }else{
  128. // let firstColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.12)
  129. // let secondColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
  130. // drawColor([firstColor.cgColor,secondColor.cgColor])
  131. // }
  132. }
  133. override func layoutSubviews() {
  134. super.layoutSubviews()
  135. }
  136. }
  137. extension IHLampColorView{
  138. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  139. let touch : UITouch! = touches.first
  140. self.beginPoint = touch.location(in: self)
  141. self.touchView.isHidden = false
  142. self.touchView.center = self.beginPoint!
  143. }
  144. override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
  145. UIView.animate(withDuration: 2) {
  146. self.reset()
  147. }
  148. }
  149. override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
  150. UIView.animate(withDuration: 2) {
  151. self.reset()
  152. }
  153. }
  154. override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
  155. //显示控件
  156. self.touchView.isHidden = false
  157. self.lampInfoBox.isHidden = false
  158. let touch : UITouch! = touches.first
  159. self.movePoint = touch.location(in: self)
  160. let previousPoint = touch.previousLocation(in: self)
  161. let directX = movePoint!.x - previousPoint.x
  162. let directY = movePoint!.y - previousPoint.y
  163. self.touchView.center = self.movePoint!
  164. let height = movePoint!.y - beginPoint!.y
  165. let width = beginPoint!.x - movePoint!.x
  166. let rads = atan(height/width);
  167. let degrees = 180.0 * Double(rads) / .pi
  168. let deltaDegrees = abs(degrees) //角度的d绝对值 小与45度的时候 判定为 横向滑动 ;大于或者等于45度判定为纵向滑动
  169. // log.debug(deltaDegrees)
  170. if deltaDegrees.isNaN == false { //排除度数为0的情况
  171. if deltaDegrees < 45 {
  172. if isLock == false { //如果是开锁 则可以进来判断是否可以移动 ,
  173. isLock = true //进来之后就上锁
  174. isHorizontalMove = true
  175. isVerticalMove = false
  176. }
  177. }else{
  178. if isLock == false {
  179. isLock = true
  180. isHorizontalMove = false
  181. isVerticalMove = true
  182. }
  183. }
  184. }else{
  185. //起始点跟移动的点在同一点的时候, 就会产生nan
  186. //log.debug("movePoint = \(movePoint) - beginPoint = \(beginPoint)")
  187. }
  188. if isHorizontalMove == true{ // 水平滑动
  189. // log.debug(changeX)
  190. isMove = true
  191. self.colorPickerView.isHidden = false
  192. self.brightnessPickerView.isHidden = true
  193. self.colorThumb.isHidden = false
  194. self.brightThumb.isHidden = true
  195. color! += (directX )
  196. if color! > (self.colorPickerView.frame.maxX) {
  197. color = 40
  198. }
  199. if color! < 40 {
  200. color = self.colorPickerView.frame.maxX
  201. }
  202. }
  203. if isVerticalMove == true { //垂直移动
  204. isMove = true
  205. self.brightThumb.isHidden = false
  206. self.colorPickerView.isHidden = true
  207. self.brightnessPickerView.isHidden = false
  208. self.colorThumb.isHidden = true
  209. bright! += (directY ) //弹性系数
  210. if bright! < beginY! {
  211. bright = beginY
  212. }
  213. if bright! > endY!{
  214. bright = endY
  215. }
  216. }
  217. }
  218. }
  219. extension IHLampColorView{
  220. fileprivate func setViewColor(_ color :UIColor) {
  221. self.colors = [getAlphaColor(color).cgColor,color.cgColor]
  222. }
  223. fileprivate func setColorBrightness(_ brightness:CGFloat){
  224. if let hvalue = self.hvalue {
  225. let color = UIColor(hue: hvalue, saturation: 1, brightness: brightness, alpha: 1)
  226. self.colors = [getAlphaColor(color).cgColor,color.cgColor]
  227. currentColor(color)
  228. }
  229. }
  230. fileprivate func drawColor(_ colors:[CGColor]) {
  231. if self.colors?.count == 2 {
  232. self.gradientLayer?.colors = colors
  233. }else{
  234. let firstColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.12).cgColor
  235. let secondColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1).cgColor
  236. self.gradientLayer?.colors = [firstColor,secondColor]
  237. }
  238. // let endRadius = sqrt(pow(frame.width/2, 2) + pow(frame.height/2, 2))
  239. // let center = CGPoint(x: bounds.size.width / 2, y: bounds.size.height / 2)
  240. // let gradient = CGGradient(colorsSpace: nil, colors: colors as CFArray, locations: nil)
  241. // let context = UIGraphicsGetCurrentContext()
  242. // context?.drawRadialGradient(gradient!, startCenter: center, startRadius: 0.0, endCenter: center, endRadius: endRadius, options: CGGradientDrawingOptions.drawsBeforeStartLocation)
  243. }
  244. fileprivate func currentColor(_ color :UIColor ) {
  245. let coms = color.cgColor.components
  246. var r ,g,b : Int
  247. //考虑灰度情况
  248. if coms?.count == 2 {
  249. r = Int((coms?.first)! * CGFloat(255))
  250. g = Int((coms?.first)! * CGFloat(255))
  251. b = Int((coms?.first)! * CGFloat(255))
  252. }else{
  253. r = Int((coms?[0])! * CGFloat(255))
  254. g = Int((coms?[1])! * CGFloat(255))
  255. b = Int((coms?[2])! * CGFloat(255))
  256. }
  257. colorValueBtn.setTitle("R:\(r) G:\(g) B:\(b)", for: .normal)
  258. self.finalColor = ColorStruct(Red: r, Green: g, Blue: b)
  259. }
  260. fileprivate func getAlphaColor(_ color:UIColor) -> UIColor {
  261. let coms = color.cgColor.components
  262. var r ,g,b : CGFloat
  263. //考虑灰度情况
  264. if coms?.count == 2 {
  265. r = CGFloat((coms?.first)! * CGFloat(255))
  266. g = CGFloat((coms?.first)! * CGFloat(255))
  267. b = CGFloat((coms?.first)! * CGFloat(255))
  268. }else{
  269. r = CGFloat((coms?[0])! * CGFloat(255))
  270. g = CGFloat((coms?[1])! * CGFloat(255))
  271. b = CGFloat((coms?[2])! * CGFloat(255))
  272. }
  273. return UIColor(red: r, green: g, blue: b, alpha: 0.12)
  274. }
  275. fileprivate func reset() {//开始移动 - 判断是横滑还是竖滑
  276. isLock = false // 解锁
  277. self.isHorizontalMove = false
  278. self.isVerticalMove = false
  279. self.colorPickerView.isHidden = true
  280. self.brightnessPickerView.isHidden = true
  281. self.touchView.isHidden = true
  282. self.lampInfoBox.isHidden = true
  283. self.brightThumb.isHidden = true
  284. self.colorThumb.isHidden = true
  285. Intermediate.isRegulateColor = "1"
  286. if isMove == true{
  287. // 255 0 249
  288. if let finalColor = self.finalColor {
  289. if let block = self.paletteComplition {
  290. block(finalColor)
  291. }
  292. }
  293. isMove = false
  294. }
  295. }
  296. //填充颜色
  297. fileprivate func _fill(_ aColor :UIColor){
  298. // log.debug("color - \(color)")
  299. var r : Float = 0
  300. var g : Float = 0
  301. var b : Float = 0
  302. var a : Float = 0
  303. var h : Float = 0
  304. var s : Float = 0
  305. var v : Float = 0
  306. let comp = aColor.cgColor.components
  307. r = Float(comp![0])
  308. g = Float(comp![1])
  309. b = Float(comp![2])
  310. a = Float(comp![3])
  311. RGBToHSV(r, g, b, &h, &s, &v, true) //调用c方法 自动转换
  312. self.hvalue = CGFloat(h)
  313. self.color = colorPickerWidth * (self.hvalue ?? 0) + 40
  314. let bri = CGFloat(v)
  315. let centerY = endY! - 400 * bri
  316. self.brightThumb.center.y = centerY
  317. self.brightnessBtn.setTitle("\(Int(bri * 100))%", for: .normal)
  318. self.bright = centerY
  319. setColorBrightness(bri)
  320. }
  321. }