// // IHLightColorView.swift // Inhealth // // Created by weclouds on 2020/8/21. // Copyright © 2020 weclouds. All rights reserved. // import UIKit class IHLightColorView: UIView { //调色结果 var paletteComplition:((ColorStruct)->Void)? fileprivate var gradientLayer :IHGradientLayer? @IBOutlet weak var brightnessBtn: UIButton! @IBOutlet weak var colorValueBtn: UIButton! @IBOutlet weak var touchView: UIImageView! @IBOutlet weak var brightThumb: UIImageView! @IBOutlet weak var colorThumb: UIImageView! @IBOutlet weak var brightnessPickerView: UIView! @IBOutlet weak var colorPickerView: IHColorPickerView! @IBOutlet weak var lampInfoBox: UIView! var isVerticalMove :Bool! = false // 纵轴移动 { didSet{ if self.isVerticalMove == true { self.colorPickerView.isHidden = true self.colorThumb.isHidden = true self.brightnessPickerView.isHidden = false self.brightThumb.isHidden = false }else { self.colorPickerView.isHidden = true self.colorThumb.isHidden = true self.brightnessPickerView.isHidden = true self.brightThumb.isHidden = true } } } var isHorizontalMove :Bool! = false //横轴移动 { didSet{ if self.isHorizontalMove == true { self.colorPickerView.isHidden = false self.colorThumb.isHidden = false self.brightnessPickerView.isHidden = true self.brightThumb.isHidden = true }else { self.colorPickerView.isHidden = true self.colorThumb.isHidden = true self.brightnessPickerView.isHidden = true self.brightThumb.isHidden = true } } } var isLock:Bool? = false //加一把锁 保证单独执行 let horizontalSensitivity : CGFloat = 30 //水平灵敏度 let sensitivity : CGFloat = 50 //灵敏度 移动的又有效距离 / sensitivity let beginY :CGFloat? = (KSCREENHEIGHT - 400 ) / 2 let endY :CGFloat? = (KSCREENHEIGHT - 400 ) / 2 + 400 let colorPickerWidth = KSCREENWIDTH - 80 var beginPoint : CGPoint? var movePoint : CGPoint? var isMove:Bool! = false var finalColor:ColorStruct? var currentColor:ColorStruct?{ didSet{ if let color = self.currentColor { let curColor = UIColor(red: color.Red!, green: color.Green!, blue: color.Blue!) _fill(curColor!) //填充当前颜色 colorValueBtn.setTitle("R:\(color.Red!) G:\(color.Green!) B:\(color.Blue!)", for: .normal) // self.finalColor = color //赋初值 ,如果没有处理,最后就是这个值 } } } var colors :[CGColor]? = [CGColor](){ didSet{ // self.setNeedsDisplay() if let colors = self.colors { drawColor(colors) } } } var hvalue:CGFloat? = 0{ didSet{ if let hvalue = self.hvalue { let color = UIColor(hue: hvalue, saturation: 1, brightness: self.brightness ?? 1, alpha: 1) setViewColor(color) currentColor(color) } } } //颜色亮度 var brightness :CGFloat? var bright : CGFloat?{ didSet{ if let bright = self.bright { self.brightThumb.center.y = (bright ) let result = (400 - (bright - beginY!) ) / 400 * 100 self.brightnessBtn.setTitle("\(Int(result))%", for: .normal) self.brightness = result / 100 setColorBrightness(result / 100) } } } var color : CGFloat?{ didSet{ if let color = self.color { self.colorThumb.center.x = color self.hvalue = (color - 40) / colorPickerWidth } } } override func awakeFromNib() { super.awakeFromNib() _fill(UIColor.red)//默认 gradientLayer = IHGradientLayer() gradientLayer?.frame = self.bounds self.layer.insertSublayer(gradientLayer!, at: 0) } func setupUI() { brightnessBtn.layoutButton(style: .Left, imageTitleSpace: 10) colorValueBtn.layoutButton(style: .Left , imageTitleSpace: 10) } override func draw(_ rect: CGRect) { // colors = [UIColor.white.cgColor,UIColor.blue.cgColor] // if self.colors?.count == 2 { // drawColor(self.colors!) // }else{ // let firstColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.12) // let secondColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1) // drawColor([firstColor.cgColor,secondColor.cgColor]) // } } override func layoutSubviews() { super.layoutSubviews() } } extension IHLightColorView{ override func touchesBegan(_ touches: Set, with event: UIEvent?) { let touch : UITouch! = touches.first self.beginPoint = touch.location(in: self) self.touchView.isHidden = false self.touchView.center = self.beginPoint! } override func touchesCancelled(_ touches: Set, with event: UIEvent?) { UIView.animate(withDuration: 2) { self.reset() } } override func touchesEnded(_ touches: Set, with event: UIEvent?) { UIView.animate(withDuration: 2) { self.reset() } } override func touchesMoved(_ touches: Set, with event: UIEvent?) { //显示控件 self.touchView.isHidden = false self.lampInfoBox.isHidden = false let touch : UITouch! = touches.first self.movePoint = touch.location(in: self) let previousPoint = touch.previousLocation(in: self) let directX = movePoint!.x - previousPoint.x let directY = movePoint!.y - previousPoint.y self.touchView.center = self.movePoint! let height = movePoint!.y - beginPoint!.y let width = beginPoint!.x - movePoint!.x let rads = atan(height/width); let degrees = 180.0 * Double(rads) / .pi let deltaDegrees = abs(degrees) //角度的d绝对值 小与45度的时候 判定为 横向滑动 ;大于或者等于45度判定为纵向滑动 // log.debug(deltaDegrees) if deltaDegrees.isNaN == false { //排除度数为0的情况 if deltaDegrees < 45 { if isLock == false { //如果是开锁 则可以进来判断是否可以移动 , isLock = true //进来之后就上锁 isHorizontalMove = true isVerticalMove = false } }else{ if isLock == false { isLock = true isHorizontalMove = false isVerticalMove = true } } }else{ //起始点跟移动的点在同一点的时候, 就会产生nan //log.debug("movePoint = \(movePoint) - beginPoint = \(beginPoint)") } if isHorizontalMove == true{ // 水平滑动 // log.debug(changeX) isMove = true self.colorPickerView.isHidden = false self.brightnessPickerView.isHidden = true self.colorThumb.isHidden = false self.brightThumb.isHidden = true color! += (directX ) if color! > (self.colorPickerView.frame.maxX) { color = 40 } if color! < 40 { color = self.colorPickerView.frame.maxX } } if isVerticalMove == true { //垂直移动 isMove = true self.brightThumb.isHidden = false self.colorPickerView.isHidden = true self.brightnessPickerView.isHidden = false self.colorThumb.isHidden = true bright! += (directY ) //弹性系数 if bright! < beginY! { bright = beginY } if bright! > endY!{ bright = endY } } } } extension IHLightColorView{ fileprivate func setViewColor(_ color :UIColor) { self.colors = [getAlphaColor(color).cgColor,color.cgColor] } fileprivate func setColorBrightness(_ brightness:CGFloat){ if let hvalue = self.hvalue { let color = UIColor(hue: hvalue, saturation: 1, brightness: brightness, alpha: 1) self.colors = [getAlphaColor(color).cgColor,color.cgColor] currentColor(color) } } fileprivate func drawColor(_ colors:[CGColor]) { if self.colors?.count == 2 { self.gradientLayer?.colors = colors }else{ let firstColor = UIColor(red: 1, green: 0, blue: 0, alpha: 0.12).cgColor let secondColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1).cgColor self.gradientLayer?.colors = [firstColor,secondColor] } // let endRadius = sqrt(pow(frame.width/2, 2) + pow(frame.height/2, 2)) // let center = CGPoint(x: bounds.size.width / 2, y: bounds.size.height / 2) // let gradient = CGGradient(colorsSpace: nil, colors: colors as CFArray, locations: nil) // let context = UIGraphicsGetCurrentContext() // context?.drawRadialGradient(gradient!, startCenter: center, startRadius: 0.0, endCenter: center, endRadius: endRadius, options: CGGradientDrawingOptions.drawsBeforeStartLocation) } fileprivate func currentColor(_ color :UIColor ) { let coms = color.cgColor.components var r ,g,b : Int //考虑灰度情况 if coms?.count == 2 { r = Int((coms?.first)! * CGFloat(255)) g = Int((coms?.first)! * CGFloat(255)) b = Int((coms?.first)! * CGFloat(255)) }else{ r = Int((coms?[0])! * CGFloat(255)) g = Int((coms?[1])! * CGFloat(255)) b = Int((coms?[2])! * CGFloat(255)) } colorValueBtn.setTitle("R:\(r) G:\(g) B:\(b)", for: .normal) self.finalColor = ColorStruct(Red: r, Green: g, Blue: b) } fileprivate func getAlphaColor(_ color:UIColor) -> UIColor { let coms = color.cgColor.components var r ,g,b : CGFloat //考虑灰度情况 if coms?.count == 2 { r = CGFloat((coms?.first)! * CGFloat(255)) g = CGFloat((coms?.first)! * CGFloat(255)) b = CGFloat((coms?.first)! * CGFloat(255)) }else{ r = CGFloat((coms?[0])! * CGFloat(255)) g = CGFloat((coms?[1])! * CGFloat(255)) b = CGFloat((coms?[2])! * CGFloat(255)) } return UIColor(red: r, green: g, blue: b, alpha: 0.12) } fileprivate func reset() {//开始移动 - 判断是横滑还是竖滑 isLock = false // 解锁 self.isHorizontalMove = false self.isVerticalMove = false self.colorPickerView.isHidden = true self.brightnessPickerView.isHidden = true self.touchView.isHidden = true self.lampInfoBox.isHidden = true self.brightThumb.isHidden = true self.colorThumb.isHidden = true Intermediate.isRegulateColor = "1" if isMove == true{ // 255 0 249 if let finalColor = self.finalColor { if let block = self.paletteComplition { block(finalColor) } } isMove = false } } //填充颜色 fileprivate func _fill(_ aColor :UIColor){ // log.debug("color - \(color)") var r : Float = 0 var g : Float = 0 var b : Float = 0 var a : Float = 0 var h : Float = 0 var s : Float = 0 var v : Float = 0 let comp = aColor.cgColor.components r = Float(comp![0]) g = Float(comp![1]) b = Float(comp![2]) a = Float(comp![3]) RGBToHSV(r, g, b, &h, &s, &v, true) //调用c方法 自动转换 self.hvalue = CGFloat(h) self.color = colorPickerWidth * (self.hvalue ?? 0) + 40 let bri = CGFloat(v) let centerY = endY! - 400 * bri self.brightThumb.center.y = centerY self.brightnessBtn.setTitle("\(Int(bri * 100))%", for: .normal) self.bright = centerY setColorBrightness(bri) } }