日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

动手教你撸一个iOS颜色拾取器

發(fā)布時(shí)間:2023/12/10 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动手教你撸一个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ò),歡迎將生活随笔推薦給好友。