本地相冊開發(fā)

PHFetchResult

相簿內(nèi)的資源否灾,用了存放的PHAsset
結(jié)果中的內(nèi)容可以像使用NSArray類的方法獲取內(nèi)容一樣來獲取PHFetchResult中的內(nèi)容腺劣。一個(gè)PHFetchResult對象中的內(nèi)容是動態(tài)加載的榛做,如果你需要一些內(nèi)容它才會去照片庫中去獲取對應(yīng)的內(nèi)容桐款,這可以在處理大量的結(jié)果的時(shí)候提供一個(gè)最佳的性能阳柔。


PHCachingImageManager

帶緩存的圖片管理對象
stopCachingImagesForAllAssets: 方法
allowsCachingHighQualityImages:方法
requestImage:獲取縮略圖方法


PHImageRequestOptions

配置獲取請求參數(shù)
synchronous: 同步獲取圖片没酣、多圖轻专、高清會太卡
deliveryMode:請求的圖像質(zhì)量和交付優(yōu)先級

// 為了平衡圖像質(zhì)量和響
case opportunistic
//  只提供最高質(zhì)量的圖像忆矛,無論它需要多少時(shí)間加載
case highQualityFormat
// 最快速的得到一個(gè)圖像結(jié)果,可能會犧牲圖像質(zhì)量
case fastFormat

resizeMode:請求圖像數(shù)據(jù)時(shí)將圖像與目標(biāo)大小如何適應(yīng)

// 不做任何調(diào)整
case none
// 最快速的調(diào)整圖像大小请垛,有可能比給定大小
case fast
// 保證與給定大小相等
case exact

代碼

self.requestOptions?.deliveryMode = PHImageRequestOptionsDeliveryMode.highQualityFormat
self.requestOptions?.resizeMode = PHImageRequestOptionsResizeMode.exact

PHAsset

mediaType: 類型

// 未知
case unknown
// 圖片
case image
// 視頻
case video
// 音頻
case audio

獲取文件大小

PHAssetResource *resource = [[PHAssetResource assetResourcesForAsset:self.phasset] firstObject];
long long size = [[resourcevalueForKey:@"fileSize"] longLongValue];
let result :PHAssetResource = PHAssetResource.assetResources(for: asset).first!
let size = NSString(format: "%d", result.value(forKey: "fileSize") as! UInt64).floatValue

PHPhotoLibrary

requestAuthorization: 申請權(quán)限
performChangesAndWait:方法

圖片保存到指定的相冊中

do{
    try PHPhotoLibrary.shared().performChangesAndWait({
          // 安全校驗(yàn)
         if createdAssetId.count > 0 {
               // 獲取系統(tǒng)相冊文件
              let createdAssets:PHFetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [createdAssetId], options: nil)
              let request: PHAssetCollectionChangeRequest = PHAssetCollectionChangeRequest.init(for: collection as! PHAssetCollection)!
                request.insertAssets(createdAssets, at: NSIndexSet.init(index: 0) as IndexSet)
            }else {
                print("報(bào)錯(cuò) url: \(createdAssetId)")
            }
       })
    }catch{
        print("保存指定相冊 error:\(error)")
    }
} catch{
    print("打印報(bào)錯(cuò)1: \(error)")
}

PHFetchOptions


PHAssetCollection

fetchAssetCollections:方法


PHCollectionList

fetchTopLevelUserCollections:方法


由于系統(tǒng)返回的相冊集名稱為英文催训,我們需要轉(zhuǎn)換為中文

private func titleOfAlbumForChinse(title:String?) -> String? {
        if title == "Slo-mo" {
            return "慢動作"
        } else if title == "Recently Added" {
            return "最近添加"
        } else if title == "Favorites" {
            return "個(gè)人收藏"
        } else if title == "Recently Deleted" {
            return "最近刪除"
        } else if title == "Videos" {
            return "視頻"
        } else if title == "All Photos" {
            return "所有照片"
        } else if title == "Selfies" {
            return "自拍"
        } else if title == "Screenshots" {
            return "屏幕快照"
        } else if title == "Camera Roll" {
            return "相機(jī)膠卷"
        }
        return title
    }

生成自定義相冊

// 獲取App 名稱
let title: String = Bundle.main.infoDictionary!["CFBundleDisplayName"] as! String
        print("打印相冊名稱: \(title)")
// 相冊
var collection :PHCollection? = nil
//列出所有用戶創(chuàng)建的相冊
let userCollections = PHCollectionList.fetchTopLevelUserCollections(with: nil)
let count:Int = userCollections.count
    for i in 0..<count {
       let c = userCollections[i]
       let cName: String = c.localizedTitle!
       print("打印 用戶創(chuàng)建的相冊:\(cName) title:\(title)")
       if cName == title {
            collection = c
            break;
       }
    }
// 生成app相冊
if collection == nil {
    // 相冊唯一識別ID
   var createdCollectionID: String?
   do {
       try PHPhotoLibrary.shared().performChangesAndWait {
      //創(chuàng)建一個(gè)相冊,拿到相冊的唯一標(biāo)識符
         createdCollectionID = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: title).placeholderForCreatedAssetCollection.localIdentifier
      }
    }catch{
       print("creationRequest.error: \(error)")
    }
    // 獲取相冊
    collection = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [createdCollectionID!], options: nil).firstObject
}
return collection!

優(yōu)化卡頓問題

UICollectionView

  • 盡可能格子不要出現(xiàn)太多,格子不要出現(xiàn)太大
  • 修改控件屬性 isOpaque = true宗收、masksToBounds = true漫拭、 shouldRasterize = true 、contentsGravity混稽、contentsScale
  • PHCachingImageManager 的屬性: allowsCachingHighQualityImages
func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
        
        self.imageManager.allowsCachingHighQualityImages = false
    }
    
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        
        if decelerate == false {
            self.imageManager.allowsCachingHighQualityImages = true
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末采驻,一起剝皮案震驚了整個(gè)濱河市审胚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌礼旅,老刑警劉巖膳叨,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痘系,居然都是意外死亡菲嘴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門汰翠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來龄坪,“玉大人,你說我怎么就攤上這事奴璃∠つ” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵苟穆,是天一觀的道長抄课。 經(jīng)常有香客問我,道長雳旅,這世上最難降的妖魔是什么跟磨? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮攒盈,結(jié)果婚禮上抵拘,老公的妹妹穿的比我還像新娘。我一直安慰自己型豁,他們只是感情好僵蛛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迎变,像睡著了一般充尉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衣形,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天驼侠,我揣著相機(jī)與錄音,去河邊找鬼谆吴。 笑死倒源,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的句狼。 我是一名探鬼主播笋熬,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腻菇!你這毒婦竟也來了突诬?” 一聲冷哼從身側(cè)響起苫拍,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旺隙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骏令,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔬捷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榔袋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片周拐。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凰兑,靈堂內(nèi)的尸體忽然破棺而出妥粟,到底是詐尸還是另有隱情,我是刑警寧澤吏够,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布勾给,位于F島的核電站,受9級特大地震影響锅知,放射性物質(zhì)發(fā)生泄漏播急。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一售睹、第九天 我趴在偏房一處隱蔽的房頂上張望桩警。 院中可真熱鬧,春花似錦昌妹、人聲如沸捶枢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烂叔。三九已至,卻和暖如春蚜厉,著一層夾襖步出監(jiān)牢的瞬間长已,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工昼牛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留术瓮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓贰健,卻偏偏與公主長得像胞四,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子伶椿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 現(xiàn)在很多app都有用到相冊選擇等功能辜伟,網(wǎng)上也已經(jīng)有了很多封裝好了的第三方庫氓侧,但是最近項(xiàng)目中,設(shè)計(jì)師突發(fā)奇想导狡,想要節(jié)...
    斌哥nice閱讀 982評論 0 1
  • 一约巷、 PhotoKit的變量: PHAdjustmentData: When a user edits an as...
    漓汐Arthur閱讀 1,660評論 1 3
  • 在iOS8.0以后,蘋果推出了管理相冊的新框架旱捧,在熟悉以往的相冊框架的情況下独郎,再來看看新框架剛開始可能有點(diǎn)兒不適應(yīng)...
    Treey_Ahao閱讀 2,529評論 3 0
  • Photokit介紹 1,基類 PHObject Photos 框架中的根類PHObject只有一個(gè)公開接口 lo...
    Silence_xl閱讀 2,052評論 0 1
  • 前言 不知讀者們在平日里使用聊天工具時(shí),有沒有發(fā)表情的習(xí)慣枚赡。是不是常常在與朋友們聊天時(shí)氓癌,一言不合就掀起一場斗圖大會...
    Alan_Sim閱讀 2,664評論 2 11