web-dev-qa-db-ja.com

Swift 3:UIImagePickerControllerを使用せずにPhotos / CameraRollから写真をロードする

この質問は以前に尋ねられました しかしSwift 3。私は過去3週間立ち往生しているのと同じ解決策を探しています。

私は調査を行い、UIImagePickerControllerを使用してPhotos/Camera Rollからアプリに画像をロードすることに関する多数のYoutubeビデオを見ましたが、ユーザーの操作なしで写真にアクセスしたいと思います。

カメラロールから一連の写真を読み、写真スライドに入れて1枚ずつ表示したいと思います。 UIImagePickerControllerなしでこれらの写真にアクセスするにはどうすればよいですか?

7
Spiral1ng

Photosフレームワークを使用して、CameraRoll/Photosから写真をフェッチできます。

これがSwift 3コードのバージョンです。

写真フレームワークをインポートする

_import Photos

//Array of PHAsset type for storing photos
var images = [PHAsset]()
_

この関数を使用して、viewDidLoadのどこか、またはアクションで写真をフェッチする場所で写真をフェッチします。

_func getImages() {
    let assets = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: nil)
    assets.enumerateObjects({ (object, count, stop) in
       // self.cameraAssets.add(object)
        self.images.append(object)
    })

    //In order to get latest image first, we just reverse the array
    self.images.reverse() 

    // To show photos, I have taken a UICollectionView       
    self.photosCollectionView.reloadData()
}
_

残りはUICollectionViewデータソースとデリゲートです。画像の表示方法については、cellForItemデータソースメソッドを参照してください。

_ func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
       return images.count
    }

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "PhotoCollectionViewCell", for: indexPath) as! PhotoCollectionViewCell
    let asset = images[indexPath.row]
    let manager = PHImageManager.default()
    if cell.tag != 0 {
            manager.cancelImageRequest(PHImageRequestID(cell.tag))
        }
    cell.tag = Int(manager.requestImage(for: asset,
                                            targetSize: CGSize(width: 120.0, height: 120.0),
                                            contentMode: .aspectFill,
                                            options: nil) { (result, _) in
                                                cell.photoImageView?.image = result
        })
    return cell
}
_

必要に応じて、以下の代理人を調整してください。

_func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width = self.view.frame.width * 0.32
    let height = self.view.frame.height * 0.179910045
    return CGSize(width: width, height: height)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
    return 2.5
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
    return 0
}
_

写真の許可[〜#〜] on [〜#〜]を維持してください。 [許可しない]をクリックした場合は、PHPhotoLibrary.authorizationStatus()を使用して認証も管理する必要があります

写真 フレームワークについてもっと読むことができます。

22