【问题标题】:Questions about removing ios photo asset in Swift关于在 Swift 中删除 ios 照片资源的问题
【发布时间】:2019-05-24 04:51:01
【问题描述】:

此源代码是一个照片应用程序,类似于 iPhone 的照片应用程序。 启动应用程序时,会显示每个 Asset,即 CollectionViewCell

我想问的是选择和删除图像资产的能力。如果您查看 iPhone 照片应用程序,您可以按选择按钮选择照片并删除和共享所选照片。您可以选择任意数量的照片,而不仅仅是一张。我已经实现了@IBAction selectButtonPressed

class PhotoCollectionViewController: UICollectionViewController {

    @IBOutlet weak var sortButton: UIBarButtonItem!
    @IBOutlet weak var selectButton: UIBarButtonItem!
    @IBOutlet weak var actionButton: UIBarButtonItem!
    @IBOutlet weak var trashButton: UIBarButtonItem!

    // MARK:- Properties
    var fetchResult: PHFetchResult<PHAsset>? {
        didSet {
            OperationQueue.main.addOperation {
                self.collectionView?.reloadSections(IndexSet(0...0))
            }
        }
    }
    var assetCollection: PHAssetCollection?

    // MARK:- Privates
    private let cellReuseIdentifier: String = "photoCell"
    private lazy var cachingImageManager: PHCachingImageManager = {
        return PHCachingImageManager()
    }()

    // MARK:- Life Cycle
    deinit {
        PHPhotoLibrary.shared().unregisterChangeObserver(self)
    }

    @IBAction func sortButtonPressed(_ sender: UIBarButtonItem) {

        let fetchOptions: PHFetchOptions = PHFetchOptions()

        if (self.sortButton.title == "In the past") {
            fetchOptions.sortDescriptors = [NSSortDescriptor(key: "modificationDate",
                                                             ascending: false)]
            self.fetchResult = PHAsset.fetchAssets(in: assetCollection!, options: fetchOptions )
            self.sortButton.title = "The latest"
        } else if (self.sortButton.title == "The latest") {
            fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate",
                                                             ascending: true)]
            self.fetchResult = PHAsset.fetchAssets(in: assetCollection!, options: fetchOptions )
            self.sortButton.title = "In the past"
        }
    }

     @IBAction func seletButtonPressed(_ sender: Any) {
        if (self.sortButton.isEnabled == true) {
            self.sortButton.isEnabled = false
            self.actionButton.isEnabled = true
            self.trashButton.isEnabled = true
        } else if (self.sortButton.isEnabled == false) {
            self.sortButton.isEnabled = true
            self.actionButton.isEnabled = false
            self.trashButton.isEnabled = false
        }

        PHPhotoLibrary.shared().performChanges({
            //Delete Photo
            PHAssetChangeRequest.deleteAssets(self.fetchResult!)
            },
            completionHandler: {(success, error)in
                NSLog("\nDeleted Image -> %@", (success ? "Success":"Error!"))
                if(success){
                }else{
                print("Error: \(error)")
                }
        })
    }
}

extension PhotoCollectionViewController {

    private func configureCell(_ cell: PhotoCollectionViewCell,
                               collectionView: UICollectionView,
                               indexPath: IndexPath) {

        guard let asset: PHAsset = self.fetchResult?.object(at: indexPath.item) else { return }

        let manager: PHCachingImageManager = self.cachingImageManager
        let handler: (UIImage?, [AnyHashable:Any]?) -> Void = { image, _ in

            let cellAtIndex: UICollectionViewCell? = collectionView.cellForItem(at: indexPath)

            guard let cell: PhotoCollectionViewCell = cellAtIndex as? PhotoCollectionViewCell
                else { return }

            cell.imageView.image = image
        }

        manager.requestImage(for: asset,
                             targetSize: CGSize(width: 100, height: 100),
                             contentMode: PHImageContentMode.aspectFill,
                             options: nil,
                             resultHandler: handler)
    }
}

// MARK:- UICollectionViewDataSource
extension PhotoCollectionViewController {

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    override func collectionView(_ collectionView: UICollectionView,
                                 numberOfItemsInSection section: Int) -> Int {

        return self.fetchResult?.count ?? 0
    }
}

extension PhotoCollectionViewController {

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

        let cell: PhotoCollectionViewCell
        cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.cellReuseIdentifier,
                                                  for: indexPath) as! PhotoCollectionViewCell

        return cell
    }

    override func collectionView(_ collectionView: UICollectionView,
                                 willDisplay cell: UICollectionViewCell,
                                 forItemAt indexPath: IndexPath) {

        guard let cell: PhotoCollectionViewCell = cell as? PhotoCollectionViewCell else {
            return
        }

        self.configureCell(cell, collectionView: collectionView, indexPath: indexPath)
    }
}

// MARK:- UICollectionViewDelegateFlowLayout
extension PhotoCollectionViewController: UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {

        guard let flowLayout: UICollectionViewFlowLayout =
            self.collectionViewLayout as? UICollectionViewFlowLayout else { return CGSize.zero}

        let numberOfCellsInRow: CGFloat = 4
        let viewSize: CGSize = self.view.frame.size
        let sectionInset: UIEdgeInsets = flowLayout.sectionInset

        let interitemSpace: CGFloat = flowLayout.minimumInteritemSpacing * (numberOfCellsInRow - 1)

        var itemWidth: CGFloat
        itemWidth = viewSize.width - sectionInset.left - sectionInset.right - interitemSpace
        itemWidth /= numberOfCellsInRow

        let itemSize = CGSize(width: itemWidth, height: itemWidth)

        return itemSize
    }
}

extension PhotoCollectionViewController {
    private func updateCollectionView(with changes: PHFetchResultChangeDetails<PHAsset>) {
        guard let collectionView = self.collectionView else { return }

        // 업데이트는 삭제, 삽입, 다시 불러오기, 이동 순으로 진행합니다
        if let removed: IndexSet = changes.removedIndexes, removed.count > 0 {
            collectionView.deleteItems(at: removed.map({
                IndexPath(item: $0, section: 0)
            }))
        }

        if let inserted: IndexSet = changes.insertedIndexes, inserted.count > 0 {
            collectionView.insertItems(at: inserted.map({
                IndexPath(item: $0, section: 0)
            }))
        }

        if let changed: IndexSet = changes.changedIndexes, changed.count > 0 {
            collectionView.reloadItems(at: changed.map({
                IndexPath(item: $0, section: 0)
            }))
        }

        changes.enumerateMoves { fromIndex, toIndex in
            collectionView.moveItem(at: IndexPath(item: fromIndex, section: 0),
                                    to: IndexPath(item: toIndex, section: 0))
        }
    }
}

// MARK:- PHPhotoLibraryChangeObserver
extension PhotoCollectionViewController: PHPhotoLibraryChangeObserver {

    private func resetCachedAssets() {
        self.cachingImageManager.stopCachingImagesForAllAssets()
    }

    func photoLibraryDidChange(_ changeInstance: PHChange) {
        guard let fetchResult: PHFetchResult<PHAsset> = self.fetchResult
            else { return }

        guard let changes: PHFetchResultChangeDetails<PHAsset> =
            changeInstance.changeDetails(for: fetchResult)
            else { return }

        DispatchQueue.main.sync {
            self.resetCachedAssets()
            self.fetchResult = changes.fetchResultAfterChanges

            if changes.hasIncrementalChanges {
                self.updateCollectionView(with: changes)
            } else {
                self.collectionView?.reloadSections(IndexSet(0...0))
            }
        }
    }
}

extension PhotoCollectionViewController {

    // MARK:- Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()

        PHPhotoLibrary.shared().register(self)

        self.sortButton.title = "In the past"
        self.actionButton.isEnabled = false
        self.trashButton.isEnabled = false
    }
}

点击屏幕右上角selectbarButtonItem可以选中AssetCollection,我要删除或分享选中的图片。

【问题讨论】:

  • 你还没有问过问题。请edit您的问题并清楚地解释您需要帮助的内容。不要在评论中回复。

标签: ios swift xcode photo


【解决方案1】:

您可以对 phAsset 执行删除操作,如下所示:

PHPhotoLibrary.sharedPhotoLibrary().performChanges({
    //Delete Photo
    PHAssetChangeRequest.deleteAssets(delShotsAsset)
    },
    completionHandler: {(success, error)in
        NSLog("\nDeleted Image -> %@", (success ? "Success":"Error!"))
        if(success){

        }else{
            println("Error: \(error)")
        }
})

【讨论】:

  • 谢谢。班西希帕拉!!我再补充一个问题。提示您按“selectButton”的代码询问您是否要删除所有图像资产。我想实现的代码是按“selectButton”,这样我就可以选择要删除的图像。之后,按“删除按钮”将删除选定的图像!上面的代码与您的代码。已更正
  • 为此,您必须创建一个数组来存储所有选定的相位集,而不是执行上述代码 sn-p。通过这样做,苹果会询问您是否删除您选择的图像,并且弹出窗口显示的图像计数与传递的数组计数相同。
猜你喜欢
  • 2018-12-27
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多