多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > 綜合技術(shù) > [置頂] iOS開發(fā)進階 - 基于PhotoKit的圖片選擇器

[置頂] iOS開發(fā)進階 - 基于PhotoKit的圖片選擇器

來源:程序員人生   發(fā)布時間:2017-03-24 09:29:29 閱讀次數(shù):6240次

移動端訪問不佳,請訪問我的個人博客

很早之前就用OC把代碼寫完了并用在項目中了,1直沒時間整理,現(xiàn)在用swift重寫1份,并且更加詳細的來了解這個Photos框架,下面是我集合蘋果官方文檔和其他大神的博客寫出的1篇關(guān)于Photos框架的介紹

老規(guī)矩先上效果圖和Demo地址:

wcl

了解Photos框架

Photos是ios8出的1個新的圖片選擇框架,取代之前的AssetsLibrary框架,相比較AssetsLibrary框架Photos的用法更加靈活,發(fā)現(xiàn)在iOS9中AssetsLibrary已被棄用了,并且也不支持livePhoto,iOS9上再使用AssetsLibrary框架時還有個嚴重的問題就是圖片分辨率會變的很低,這篇文章主要講授1下Photos的簡單用法,用它做1個簡單的圖片選擇器。

Photos中各個類的簡單解釋:

類名 作用
PHAdjustmentData 當用戶編輯資源,照片與修改后的圖象或視頻數(shù)據(jù)保存在1個PHAdjustmentData對象中
PHAsset 代表照片庫中的1個資源實體,可以理解為1張照片,在打印的時候,可以清楚的看見里面包括了照片的時間、標題等信息
PHAssetChangeRequest 使用PHAssetChangeRequest對象來創(chuàng)建、刪除和修改相片庫里面的PHAsset對象
PHAssetCollectionChangeRequest 使用PHAssetCollectionChangeRequest對象來創(chuàng)建、刪除和修改相片庫里面的PHAssetCollection對象
PHAssetCreationRequest 使用PHAssetCreationRequest對象構(gòu)造1個新的照片或視頻,并將其添加到照片庫
PHAssetResource 1個PHAssetResource對象表示在照片庫中的照片或視頻資源(也就是1個PHAsset對象)相干聯(lián)的基礎數(shù)據(jù)資源之1,使用PHAssetResourceManager類獲得它
PHAssetResourceManager PHAssetResourceManager對象提供了訪問與照片資源相干的資源基礎數(shù)據(jù)存儲方法
PHChange PHChange對象來通知的照片庫中的資源的1些變法,比如增加和刪除
PHCollection PHAssetCollection對象表示1組照片或視頻資源。包括時刻和相冊中可見照片利用,和特殊的集合,如同享照片流。
PHCollectionListChangeRequest 使用PHCollectionListChangeRequest對象在1個照片庫中創(chuàng)建、刪除或修改PHCollectionList對象。
PHContentEditingInput PHContentEditingInput對象描寫資產(chǎn)用于編輯元數(shù)據(jù)
PHContentEditingOutput PHContentEditingOutput對象表示編輯照片資產(chǎn)的照片或視頻內(nèi)容的結(jié)果
PHFetchOptions 獲得資源時的檢索參數(shù),可以傳 nil,即便用系統(tǒng)默許值
PHFetchResult 通過PHFetchResult來獲得照片實體的有序列表
PHImageManager PHImageManager對象提供用于加載與PHAsset對象相干聯(lián)的圖象或視頻數(shù)據(jù)的方法。使用這些方法來獲得全尺寸照片資產(chǎn)或縮略圖,或檢索AV Foundation對象播放,導出和操縱的視頻資產(chǎn)。
PHLivePhoto 用來獲得LivePhoto實體
PHObject 照片等實體的抽象類
PHPhotoLibrary PHPhotoLibrary對象表示用戶的照片庫整套資源和收藏的照片,包括存儲在本地裝備上在iCloud的照片對象。
PhotosTypes 與Photos框架相干的類型的枚舉

獲得相冊列表

獲得相冊列表可以需要用到1下類:

  • PHFetchOptions:對象檢索的對象,可以對相冊列表進行挑選
  • PHAssetCollection:圖片集合的對象,挑選后取得的集合

下面是獲得相冊列表的代碼片斷:

    //MARK: 屬性列表
    //全部相冊的數(shù)組
    private(set) var photoAlbums    = [[String: PHFetchResult<PHAsset>]]()
    private(set) var selectPhotoArr = [PHAsset]()

    //是不是同步要求圖片
    public var isSynchronous: Bool = false {
        didSet{
            self.photoOption.isSynchronous = isSynchronous
        }
    }

    //MARK: 初始化方法
    override init() {
        super.init()
        //圖片要求設置成快速獲得
        self.photoOption.resizeMode   = .fast
        self.photoOption.deliveryMode = .opportunistic
        getPhotoAlbum()
    }

    /**
     開始獲得獲得相冊列表
     */
    private func getPhotoAlbum() {
        //創(chuàng)建1個PHFetchOptions對象檢索照片
        let options = PHFetchOptions()
        //通過創(chuàng)建時間來檢索
        options.sortDescriptors = [NSSortDescriptor.init(key: photoCreationDate, ascending: false)]
        //通過數(shù)據(jù)類型來檢索,這里為只檢索照片
        options.predicate = NSPredicate.init(format: "mediaType in %@", [PHAssetMediaType.image.rawValue])
        //通過檢索條件檢索出符合檢索條件的所有數(shù)據(jù),也就是所有的照片
        let allResult = PHAsset.fetchAssets(with: options)
        //獲得用戶創(chuàng)建的相冊
        let userResult = PHAssetCollection.fetchTopLevelUserCollections(with: nil)
        //獲得智能相冊
        let smartResult = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .albumRegular, options: nil)
        //將獲得的相冊加入到相冊的數(shù)組中
        photoAlbums.append([WCLImagePickerBundle.localizedString(key: "全部照片"): allResult])

        userResult.enumerateObjects(options: .concurrent) { (collection, index, stop) in
            let assetcollection = collection as! PHAssetCollection
            //通過檢索條件從assetcollection中檢索出結(jié)果
            let assetResult = PHAsset.fetchAssets(in: assetcollection, options: options)
            if assetResult.count != 0 {
                self.photoAlbums.append([assetcollection.localizedTitle!:assetResult])
            }
        }

        smartResult.enumerateObjects(options: .concurrent) { (collection, index, stop) in
            //通過檢索條件從assetcollection中檢索出結(jié)果
            let assetResult = PHAsset.fetchAssets(in: collection, options: options)
            if assetResult.count != 0 {
                self.photoAlbums.append([collection.localizedTitle!:assetResult])
            }
        }
    }

獲得某個相冊的所有圖片列表

需要用到的類:

  • PHFetchResult:對象檢索的對象,可以對圖片進行挑選
  • PHAsset:圖片資源的對象,代表1個圖片或視頻資源

下面貼代碼片斷:

    /**
     通過下標返回相冊的PHFetchResult

     - parameter index: 選擇相冊的index

     - returns: 相冊的PHFetchResult
     */
    public func getAblumResult(_ ablumIndex: Int) -> PHFetchResult<PHAsset>? {
        if let ablum = self.photoAlbums[wcl_safe: ablumIndex] {
            if let result = ablum.values.first {
                return result
            }
        }
        return nil
    }

上面代碼中返回的result就代表選中的相冊的圖片列表

獲得到單張圖片的數(shù)據(jù)

通過上面獲得到的相冊的圖片列表通過下標就可以取得到圖片對應的PHAsset,需要用到的類:

  • PHCachingImageManager:獲得圖片數(shù)據(jù)的Manager,也可緩存數(shù)據(jù)
  • PHImageRequestOptions:獲得圖片的1些選項配置,比如獲得方式等等
  • PHAsset:圖片資源的對象,代表1個圖片或視頻資源

下面是代碼片斷:

    /**
     根據(jù)PHAsset獲得photo

     - parameter ablumIndex:    相冊的index
     - parameter alasset:       相冊里圖片的PHAsset
     - parameter photoSize:     圖片的size
     - parameter resultHandler: 返回照片的回調(diào)
     */
    public func getPhoto(_ photoSize: CGSize, alasset: PHAsset?, resultHandler: ((UIImage?, [AnyHashable: Any]?) -> Void)?) {
        if alasset != nil {
            let scale = UIScreen.main.scale
            let photoScaleSize = CGSize(width: photoSize.width*scale, height: photoSize.height*scale)
            self.photoManage.requestImage(for: alasset!, targetSize: photoScaleSize, contentMode: .aspectFill, options: self.photoOption, resultHandler: { (image, infoDic) in
                if image != nil {
                    resultHandler?(image, infoDic)
                }else {
                //沒獲得到返回默許圖片
                    let image_buffer = WCLImagePickerBundle.imageFromBundle("image-buffer")
                    resultHandler?(image_buffer, infoDic)
                }
            })
        }
    }

將圖片存入相冊

有時候我們需要將利用里的圖片存到相冊里面,1下是會用到的類:

  • PHPhotoLibrary:代表我們手機中的圖片庫,用它來操作圖片庫中的圖片
  • PHAssetChangeRequest:資源操作的要求類,用來對資源進行操作

代碼片斷:

//履行變化
PHPhotoLibrary.shared().performChanges({
        //創(chuàng)建1個圖片資源
        PHAssetChangeRequest.creationRequestForAsset(from: image)
    }, completionHandler: { (flag, error) in
        //履行結(jié)果回調(diào)
    })

總結(jié)

以上簡單的講授了1下Photos相干知識點和使用方法,更多的可以去官方文檔上去查看。用Photos自己寫了1個圖片選擇器,大家有興趣的可以去看1下,有用的話可以star1下,寫不不是很好,有甚么毛病可以指出來~最后謝謝大家的瀏覽。

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产乱辈通伦影片在线播放亚洲 | 牛牛精品国内免费一区 | 久久久久久久国产精品视频 | 在线观看视频高清视频 | 伊人色在线观看 | 久久久国产一区二区三区 | 亚洲视频大全 | 免费爱爱视频 | 免费澳门一级毛片 | 免费看黄网站大全 | 欧美在线色| 久久国产一久久高清 | 欧美性猛交xxxxbbb | 欧美成人午夜在线全部免费 | 欧美日韩国产不卡在线观看 | 国产午夜精品久久久久 | 日韩高清在线高清免费 | 亚洲精选在线 | 国产欧美日韩综合精品一区二区 | 国产区一区 | 欧美福利视频一区在线 | 激情视频在线观看免费 | 色网色| 久久亚洲精品中文字幕二区 | 亚洲国产精品乱码一区二区三区 | 亚洲一区三区 | 亚洲国产精品免费 | 久久久久久久国产精品 | 美国a视频 | 激情区小说区偷拍区图片区 | 久久大香伊人中文字幕 | 国产欧美一区二区三区在线看 | 久久婷婷五月综合色丁香 | 日韩欧美中国a v | 亚洲成人黄色网 | 亚洲成a人一区二区三区 | 日本视频中文字幕一区二区 | 亚洲视频免费在线 | 中文无码日韩欧免费视频 | 欧美a级在线| 国产或人精品日本亚洲77美色 |