iOS實(shí)現(xiàn)微信/QQ顯示最近拍攝圖片的功能實(shí)例代碼-創(chuàng)新互聯(lián)

如果你剛剛拍攝了圖片,在使用微信/QQ發(fā)生消息時(shí)會(huì)顯示“你可能要發(fā)送的圖片”,

主要從事網(wǎng)頁設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、自適應(yīng)網(wǎng)站建設(shè)、程序開發(fā)、微網(wǎng)站、成都小程序開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營銷經(jīng)驗(yàn),集策劃、開發(fā)、設(shè)計(jì)、營銷、管理等多方位專業(yè)化運(yùn)作于一體,具備承接不同規(guī)模與類型的建設(shè)項(xiàng)目的能力。

iOS實(shí)現(xiàn)微信/QQ顯示最近拍攝圖片的功能實(shí)例代碼

實(shí)現(xiàn)原理:

1、打開或重新進(jìn)入聊天窗口時(shí)查詢圖庫最新的照片, 對(duì)比拍照時(shí)間和當(dāng)前時(shí)間的差,當(dāng)?shù)陀陂撝担ɡ缫环昼姡r(shí)就顯示出來。 PS:閾值是邏輯上判斷是否最近的依據(jù)。優(yōu)點(diǎn):總能找到最近拍攝的圖片; 缺點(diǎn):每次都要查詢圖片數(shù)據(jù),響應(yīng)較慢。

2、注冊(cè)圖庫變化監(jiān)聽(觀察者模式), 響應(yīng)圖庫的增刪改事件, 拿到變化圖片數(shù)據(jù)后做對(duì)應(yīng)的邏輯。 優(yōu)點(diǎn): 實(shí)時(shí)響應(yīng); 缺點(diǎn):影響性能, 在注冊(cè)監(jiān)聽前拿不到變化數(shù)據(jù)。

實(shí)現(xiàn)方式:

1、在info.plist文件中添加訪問相機(jī)數(shù)據(jù)的權(quán)限。

iOS實(shí)現(xiàn)微信/QQ顯示最近拍攝圖片的功能實(shí)例代碼

2、在啟動(dòng)應(yīng)用后要獲取相機(jī)權(quán)限, 調(diào)用PHPhotoLibrary.requestAuthoriztion方法,提示內(nèi)容是plist對(duì)應(yīng)相機(jī)權(quán)限字段內(nèi)容(PS:跟Android的動(dòng)態(tài)權(quán)限獲取是一個(gè)套路)。

3、獲取相機(jī)權(quán)限后,要緩存所有PHAsset類型的照片記錄(不包含圖片二進(jìn)制數(shù)據(jù),所有不用擔(dān)心內(nèi)存溢出); 緩存所有圖片記錄是為了后續(xù)比較變化使用, 邏輯上是變化前數(shù)據(jù)。

4、觀察者模式的register, 注意在適當(dāng)?shù)牡胤揭獔?zhí)行unregisterChangeObserver。

5、在回調(diào)函數(shù)photoLibraryDidChange里做圖庫變化后的邏輯, 這里的PHChange類可以跟前面緩存的變化前數(shù)據(jù)比較并得到變化的部分(包括新增、刪除、修改,厲害了; Android沒有這么方便的API。。。)。

6、使用DispatchQueue.main.async是主線程異步執(zhí)行, 作用同Android主線程Handler的sendMessage。這是觀察者模式的標(biāo)準(zhǔn)做法,避免阻塞通知隊(duì)列。

7、使用PHCachingImageManager取出PHAsset的圖片數(shù)據(jù)ImageView對(duì)象。

8、顯示到UI里。

參考代碼:

import UIKit 
import Photos //使用圖庫功能時(shí)必須引用這個(gè)包 
//顯示最近拍攝的照片為縮略圖 
class ViewController: UIViewController, PHPhotoLibraryChangeObserver { 
 var assetsFetchResults:PHFetchResult<PHAsset>! 
 var imageManager: PHCachingImageManager! //帶緩存的圖片管理對(duì)象 
 var imageView: UIImageView! //用于顯示縮略圖 
 var assetGridThumbnailSize: CGSize! //縮略圖大小 
 override func viewDidLoad() { 
  super.viewDidLoad() 
  // Do any additional setup after loading the view, typically from a nib. 
  imageView = UIImageView() 
  imageView.frame = CGRect(x: 50, y: 50, width: 100, height: 100) 
  imageView.contentMode = .scaleAspectFit 
  imageView.clipsToBounds = true 
  self.view.addSubview(imageView) 
  self.imageManager = PHCachingImageManager() //初始化和充值緩存 
  let scale = UIScreen.main.scale //像素比 
  assetGridThumbnailSize = CGSize(width: imageView.frame.width*scale, 
          height: imageView.frame.height*scale) 
  //申請(qǐng)權(quán)限 
  PHPhotoLibrary.requestAuthorization({ (status) in 
   if status != .authorized { 
    return 
   } 
   //獲取所有圖片資源(按照創(chuàng)建時(shí)間排序) 
   let allPhotoOptions = PHFetchOptions() 
   allPhotoOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", 
                ascending: false)] //排序方式 
   allPhotoOptions.predicate = NSPredicate(format: "mediaType = %d", 
             PHAssetMediaType.image.rawValue) //類型 
   self.assetsFetchResults = PHAsset.fetchAssets(with: .image, 
               options: allPhotoOptions) //查詢照片類型 
   var i = 0 
   while i<self.assetsFetchResults.count { 
    let asset = self.assetsFetchResults[i] 
    print(" 創(chuàng)建時(shí)間:\(asset.creationDate?.description)") //打印所有圖片的創(chuàng)建時(shí)間 
    i += 1 
   } 
   if (self.assetsFetchResults.count > 0) { 
    //顯示最近一張拍攝的圖片(也可以根據(jù)拍攝時(shí)間遠(yuǎn)近決定是否要顯示) 
    self.imageManager.requestImage(for: self.assetsFetchResults[0],  //最近一張圖片 
            targetSize: self.assetGridThumbnailSize, 
            contentMode: .aspectFill, 
            options: nil, resultHandler: { (image, info) in 
            self.imageView.image = image //取出圖像并顯示出來 
    }) 
   } 
   print("圖片數(shù)量:\(self.assetsFetchResults?.count)") 
   //注冊(cè)監(jiān)聽資源變化 
   PHPhotoLibrary.shared().register(self) //刪除是unregisterChangeObserver 
  }) 
 } 
 override func didReceiveMemoryWarning() { 
  super.didReceiveMemoryWarning() 
  // Dispose of any resources that can be recreated. 
 } 
 func photoLibraryDidChange(_ changeInstance: PHChange) { 
  guard let changes = changeInstance.changeDetails(for: self.assetsFetchResults as! PHFetchResult<PHObject>) else { 
   return 
  } 
  //異步執(zhí)行,避免阻塞圖片變化事件隊(duì)列 
  DispatchQueue.main.async { 
   if let result = changes.fetchResultAfterChanges as? PHFetchResult<PHAsset> { 
    self.assetsFetchResults = result //差異結(jié)果 
   } 
   //判斷是否有新增圖片或刪除圖片的情況 
   if !changes.hasIncrementalChanges || changes.hasMoves { 
    return 
   } else { 
    print("圖片數(shù)據(jù)有變化") 
    if let indexs = changes.changedIndexes, indexs.count>0 { //不顯示0的情況 
     print("有\(zhòng)(indexs.count)張圖片發(fā)生變化") 
    } 
    if let removes = changes.removedIndexes, removes.count>0 { 
     print("刪除了\(removes.count)張圖片") 
    } 
    if let inserts = changes.insertedIndexes, inserts.count>0 { 
     //有新增圖片 
     print("新增了\(inserts.count)張圖片") 
     let picture = self.assetsFetchResults[inserts.first!] 
     self.imageManager.requestImage(for: picture, 
             targetSize: self.assetGridThumbnailSize, 
             contentMode: .aspectFill, 
             options: nil, resultHandler: { (image, option) in 
             self.imageView.image = image //取出圖像并顯示出來 
     }) 
    } 
   } 
  } 
 } 
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站bm7419.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站題目:iOS實(shí)現(xiàn)微信/QQ顯示最近拍攝圖片的功能實(shí)例代碼-創(chuàng)新互聯(lián)
新聞來源:http://bm7419.com/article0/goeio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、移動(dòng)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、網(wǎng)站改版、域名注冊(cè)、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司