日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > [置頂] iOS開發進階 - 基于PhotoKit的圖片選擇器

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

來源:程序員人生   發布時間:2017-03-24 09:29:29 閱讀次數:6258次

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

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

老規矩先上效果圖和Demo地址:

wcl

了解Photos框架

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

Photos中各個類的簡單解釋:

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

獲得相冊列表

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

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

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

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

        userResult.enumerateObjects(options: .concurrent) { (collection, index, stop) in
            let assetcollection = collection as! PHAssetCollection
            //通過檢索條件從assetcollection中檢索出結果
            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中檢索出結果
            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就代表選中的相冊的圖片列表

獲得到單張圖片的數據

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

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

下面是代碼片斷:

    /**
     根據PHAsset獲得photo

     - parameter ablumIndex:    相冊的index
     - parameter alasset:       相冊里圖片的PHAsset
     - parameter photoSize:     圖片的size
     - parameter resultHandler: 返回照片的回調
     */
    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({
        //創建1個圖片資源
        PHAssetChangeRequest.creationRequestForAsset(from: image)
    }, completionHandler: { (flag, error) in
        //履行結果回調
    })

總結

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

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美精品三区 | 成人毛片在线观看视频 | 黄色片视频免费 | 男女啪啪免费网站 | 久久国产免费视频 | 国产激情一区二区三区 | 国产精品 欧美激情 | 亚洲国产精品自拍 | 日韩欧美高清视频 | 精品国产31久久久久久 | 国产高清一区二区 | 国产精品久久久久久久免费大片 | 国产福利91精品一区二区三区 | 中文字幕理论片 | 亚洲一级在线观看 | 91精品国产综合久久久久蜜臀 | 国产成人精品一区 | 国产成人在线一区 | 草逼网站| 青青草av| 日韩毛片视频 | 国产伦精品一区二区三区在线 | 在线观看一区 | 亚洲视屏| 国产精品蜜 | 久久亚洲一区 | 亚洲精品2 | 男女的隐私视频网站 | 国产精品久久久久一区二区 | 国产精品久久久久久久免费大片 | 日韩伦理电影网 | 国产精品99一区二区三区 | 国产免费黄色片 | 久久久.com | 久久精品日产第一区二区三区 | 国产在线91在线电影 | 黄色黄色黄色 | 久久免费视频观看 | 日韩成人在线免费观看 | 99国产精品国产精品久久 | 麻豆av在线播放 |