生活随笔
收集整理的這篇文章主要介紹了
动手教你撸一个iOS颜色拾取器
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
iOS 實(shí)現(xiàn)圖片顏色拾取器
- 為什么需要顏色拾取
- iOS顏色拾取器的實(shí)現(xiàn)
- CGContext的使用
- 自定義顏色采集板View
- 顏色選擇器的使用
- 結(jié)束
為什么需要顏色拾取
有些APP開(kāi)發(fā)業(yè)務(wù)中經(jīng)常需要用到顏色拾取的功能,來(lái)完成對(duì)所需顏色的選擇,比如主題設(shè)置功能,廢話不多說(shuō),需要的同學(xué)自己拿去用吧!
iOS顏色拾取器的實(shí)現(xiàn)
CGContext的使用
使用CGContext進(jìn)行圖片顏色的拾取能夠節(jié)省內(nèi)存的使用(CGContext對(duì)圖片管理的具體使用后期來(lái)專(zhuān)講一下)
獲取UIImageView中的UIImage拾取坐標(biāo)的轉(zhuǎn)換利用BitmapInfo來(lái)獲取UIImage的RGB分布利用CGContext獲取目標(biāo)像素的分布值輸出對(duì)應(yīng)位置的顏色值
func getColor(inImageView imageview: UIImageView, selectedPoint: CGPoint) -> UIColor?{//imageview圖片let image: UIImage = imageview.image!//imageview中的坐標(biāo)對(duì)用image的坐標(biāo)let x_factor = image.size.width/imageview.frame.widthlet y_factor = image.size.height/imageview.frame.heightlet newSelectedPoint: CGPoint = CGPoint.init(x: selectedPoint.x*x_factor, y: y_factor*selectedPoint.y)if !CGRect.init(x: 0, y: 0, width: image.size.width, height: image.size.height).contains(newSelectedPoint){return nil}// 用來(lái)存放目標(biāo)像素值var pixel = [UInt8](repeatElement(0, count: 4))// 顏色空間為 RGB,這決定了輸出顏色的編碼是 RGB 還是其他(比如 YUV)let colorSpace = CGColorSpaceCreateDeviceRGB()// 設(shè)置位圖顏色分布為 RGBAlet bitmapInfo = CGImageAlphaInfo.premultipliedLast.rawValueguard let context = CGContext(data: &pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: bitmapInfo) else {return nil}// 設(shè)置 context 原點(diǎn)偏移為目標(biāo)位置所有坐標(biāo)context.translateBy(x: -newSelectedPoint.x, y: -newSelectedPoint.y)// 將圖像渲染到 context 中imageview.layer.render(in: context)return UIColor(red: CGFloat(pixel[0]) / 255.0,green: CGFloat(pixel[1]) / 255.0,blue: CGFloat(pixel[2]) / 255.0,alpha: CGFloat(pixel[3]) / 255.0)}
自定義顏色采集板View
View中包含UIImageView顯示需要采集顏色的圖片包含UIButton作為采集位置的指示器利用UIPanGestureRecognizer實(shí)現(xiàn)拖動(dòng)UIButton選擇采集位置
import UIKit
typealias ColorChange = (UIColor?)->Void //選擇顏色的閉包
@IBDesignable //可視化的關(guān)鍵字
class ColorSelectedView: UIView {@IBOutlet var bgview: UIView!@IBOutlet weak var gradientImageView: UIImageView!@IBOutlet weak var selectedBtn: UIButton!var panGesture: UIPanGestureRecognizer!var colorChange: ColorChange?override init(frame: CGRect) { //每一步都必須super.init(frame: frame)//實(shí)現(xiàn)父初始化bgview = loadViewFromNib() //從xib中加載視圖bgview.frame = bounds //設(shè)置約束或者布局addSubview(bgview) //將其添加到自身中}required init?(coder aDecoder: NSCoder) {super.init(coder: aDecoder)bgview = loadViewFromNib()bgview.frame = boundsaddSubview(bgview)}//MARK:加載xib文件的view視圖func loadViewFromNib() -> UIView {//重點(diǎn)注意,否則使用的時(shí)候不會(huì)同步顯示在IB中,只會(huì)在運(yùn)行中才顯示。//注意下面的nib加載方式直接影響是否可視化,如果bundle不確切(為nil或者為main)則看不到實(shí)時(shí)可視化let nib = UINib(nibName:String(describing: ColorSelectedView.self), bundle: Bundle(for:ColorSelectedView.self))//【????】怎么將類(lèi)名變?yōu)樽址?#xff1a;String(describing: MyView.self) Bundle的參數(shù)為type(of: self)也可以。let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIViewpanGesture = UIPanGestureRecognizer.init(target: self, action: #selector(gestureAction))selectedBtn?.addGestureRecognizer(panGesture)return view}//拖動(dòng)選擇需要采集顏色的位置@objc func gestureAction(_ sender: UIPanGestureRecognizer){if sender.view == self.selectedBtn{if sender.state != .ended && sender.state != .failed{let point: CGPoint = sender.location(in: self)var newpoint: CGPoint = pointif point.x < 0 {newpoint.x = 0}if point.y < 0 {newpoint.y = 0}if point.x > self.frame.size.width-30 {newpoint.x = self.frame.size.width-30}if point.y > self.frame.size.height-30 {newpoint.y = self.frame.size.height-30}self.selectedBtn.frame.origin = newpointlet selecteColor: UIColor? =self.getColor(inImageView: self.gradientImageView, selectedPoint: CGPoint.init(x: newpoint.x+15, y: newpoint.y+15))if selecteColor != nil{if colorChange != nil{colorChange!(selecteColor)}}}}}
}
顏色選擇器的使用
在xib文件中或者在storyboard可視化界面中直接使用在代碼中直接使用
@IBOutlet weak var colorSelectedView: ColorSelectedView!
...
colorSelectedView.colorChange = {(color: UIColor?) -> Void inif color != nil{...//按自己需要使用該顏色}}
結(jié)束
哈哈,可以自己拖動(dòng)Button進(jìn)行位置選擇,當(dāng)拖動(dòng)時(shí)會(huì)實(shí)時(shí)輸出選中位置的顏色。好了,就是這么簡(jiǎn)單!你也來(lái)試試吧!
總結(jié)
以上是生活随笔為你收集整理的动手教你撸一个iOS颜色拾取器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。