-
1师逸、UIImagePickerController介紹
- 選擇相冊(cè)中的圖片或者拍照伸刃,都是通過(guò)
UIImagePickerController
控制器實(shí)例化一個(gè)對(duì)象恨憎,然后通過(guò)self.present
方法推送出界面顯示撼港。 - 使用
present
的類(lèi)需要實(shí)現(xiàn)UIImagePickerControllerDelegate
,UINavigationControllerDelegate
兩個(gè)代理督弓。 -
UIImagePickerController
可以通過(guò)isSourceTypeAvailable
方法來(lái)判斷設(shè)備是否支持照相機(jī)/圖片庫(kù)/相冊(cè)功能塘幅。如果支持昔案,可以通過(guò)sourceType
屬性來(lái)設(shè)置圖片控制器的顯示類(lèi)型。
- 選擇相冊(cè)中的圖片或者拍照伸刃,都是通過(guò)
-
2.下面通過(guò)一個(gè)
demo
(swift4.0)电媳,演示如何使用UIImagePickerController
- 點(diǎn)擊“選擇照片”踏揣,自動(dòng)打開(kāi)相冊(cè)選擇照片
- 照片選中后,返回原界面并加載照片原圖匾乓,同時(shí)控制臺(tái)會(huì)打印照片的
info
信息 - 如果選擇照片前打開(kāi)“編輯”開(kāi)關(guān)捞稿,選中照片后會(huì)先進(jìn)入照片編輯頁(yè)面
3.源碼:JKSelectorPicture
-
4.源碼使用說(shuō)明
-
4.1.把JKSelectorPicture拖出來(lái)
-
4.2.在使用的控制器里面
-
4.2.1、懶加載一下控制器
// MARK: 添加圖片選擇器 private lazy var jkSelectorPictureVC: JKSelectorPictureViewController = { let vc = JKSelectorPictureViewController() vc.view.frame = CGRect(x: 0, y: 20, width: JKscreenW, height: JKscreenH-20) return vc }()
-
4.2.2拼缝、在viewDidLoad()添加下面的代碼
addChildViewController(jkSelectorPictureVC) view.addSubview(jkSelectorPictureVC.view)
-
-
-
5.核心代碼的說(shuō)明
-
5.1.可選的代理
-
5.1.1.添加
@objc
@objc protocol JKSelectorPictureCellDelegate: NSObjectProtocol { @objc optional func photoDidAddSelector(cell:JKSelectorPictureCell) @objc optional func photoDidDeleteSelector(cell:JKSelectorPictureCell) }
-
5.1.2.定義代理的變量
weak var JKPhotoCellDelegate: JKSelectorPictureCellDelegate?
-
5.1.3.代理的使用
JKPhotoCellDelegate?.photoDidAddSelector!(cell: self)
-
5.1.4.外面代理的調(diào)用(掛代理)
cell.JKPhotoCellDelegate = self as JKSelectorPictureCellDelegate
-
5.1.5.外面代理的實(shí)現(xiàn)(記得寫(xiě)上代理
JKSelectorPictureCellDelegate
)// MARK: 添加圖片 func photoDidAddSelector(cell: JKSelectorPictureCell) { }
-
-
5.2.
func photoDidAddSelector(cell: JKSelectorPictureCell)
方法里面的選擇圖片的講解5.2.1.
UIImagePickerController
的使用時(shí)候要實(shí)現(xiàn)兩個(gè)協(xié)議UINavigationControllerDelegate
,UIImagePickerControllerDelegate
-
5.2.2.
UIImagePickerControllerSourceType
有3
種類(lèi)型/* case photoLibrary 照片庫(kù)(所有的照片娱局,拍照&用 iTunes & iPhoto `同步`的照片 - 不能刪除) case camera 相機(jī) case savedPhotosAlbum 相冊(cè) (自己拍照保存的, 可以隨便刪除) */
-
5.2.3.選擇圖片的代碼
// 1.判斷能否打開(kāi)照片庫(kù) if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.photoLibrary) { print("不能打開(kāi)相冊(cè)") return } // 2.創(chuàng)建圖片選擇器 /** 設(shè)置允許用戶編輯選中的圖片 開(kāi)發(fā)中如果需要上傳頭像, 那么請(qǐng)讓用戶編輯之后再上傳 這樣可以得到一張正方形的圖片, 以便于后期處理(圓形) vc.allowsEditing = true */ //初始化圖片控制器 let picker = UIImagePickerController() // 設(shè)置轉(zhuǎn)場(chǎng)動(dòng)畫(huà)類(lèi)型 //picker.modalPresentationStyle = UIModalPresentationStyle.overFullScreen //設(shè)置代理 picker.delegate = self //指定圖片控制器類(lèi)型 picker.sourceType = UIImagePickerControllerSourceType.photoLibrary //設(shè)置是否允許編輯 picker.allowsEditing = true //彈出控制器,顯示界面 present(picker, animated: true, completion: nil)
-
5.2.4.選擇圖片代理方法的實(shí)現(xiàn)
/** 選中相片之后調(diào)用 :param: picker 促發(fā)事件的控制器 :param: info[UIImagePickerControllerEditedImage] as! UIImage 當(dāng)前選中的圖片 :param: info 編輯之后的圖片 */ func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { print("info=\(info)") /* 注意: 一般情況下,只要涉及到從相冊(cè)中獲取圖片的功能, 都需要處理內(nèi)存 一般情況下一個(gè)應(yīng)用程序啟動(dòng)會(huì)占用20M左右的內(nèi)存, 當(dāng)內(nèi)存飆升到500M左右的時(shí)候系統(tǒng)就會(huì)發(fā)送內(nèi)存警告, 此時(shí)就需要釋放內(nèi)存 , 否則就會(huì)閃退 只要內(nèi)存釋放到100M左右, 那么系統(tǒng)就不會(huì)閃退我們的應(yīng)用程序 也就是說(shuō)一個(gè)應(yīng)用程序占用的內(nèi)存20~100時(shí)是比較安全的內(nèi)容范圍 */ //獲取編輯后的圖片 let image = info[UIImagePickerControllerEditedImage] as! UIImage /* 注意: 1.如果是通過(guò)JPEG來(lái)壓縮圖片, 圖片壓縮之后是不保真的 2.蘋(píng)果官方不推薦我們使用JPG圖片,因?yàn)楝F(xiàn)實(shí)JPG圖片的時(shí)候解壓縮非常消耗性能 兩種壓縮方式 let data1 = UIImageJPEGRepresentation(image, 1.0) data1?.writeToFile("/Users/xiaomage/Desktop/1.jpg", atomically: true) let data2 = UIImageJPEGRepresentation(image, 0.1) data2?.writeToFile("/Users/xiaomage/Desktop/2.jpg", atomically: true) */ let newImage = image.imageWithScale(width: 300) // 1.將當(dāng)前選中的圖片添加到數(shù)組中 pictureImages.append(newImage) print("圖片的數(shù)量=\(pictureImages.count)") collectionView.reloadData() // 注意: 如果實(shí)現(xiàn)了該方法, 需要我們自己關(guān)閉圖片選擇器 picker.dismiss(animated: true, completion: nil) }
-
5.2.5.圖片按寬度壓縮, UIImage的分類(lèi)(
UIImage+Category.swif
)import UIKit extension UIImage { /** 根據(jù)傳入的寬度生成一張圖片 按照?qǐng)D片的寬高比來(lái)壓縮以前的圖片 :param: width 制定寬度 */ func imageWithScale(width: CGFloat) -> UIImage { // 1.根據(jù)寬度計(jì)算高度 let height = width * size.height / size.width // 2.按照寬高比繪制一張新的圖片 let currentSize = CGSize(width: width, height: height) UIGraphicsBeginImageContext(currentSize) draw(in: CGRect(origin: CGPoint.zero, size: currentSize)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } }
-
-