【问题标题】:Sorting photos exactly like native photoapp using PhotoKit使用 PhotoKit 像原生 photoapp 一样对照片进行排序
【发布时间】:2015-10-20 05:06:23
【问题描述】:

我正在尝试使用 Photos 框架重现原生 iOS8 photopicker。我的排序有问题。

假设我做了以下事情:

  1. 我在 Camera+ 应用中编辑照片并将其保存回图库。
  2. 我喜欢另一张照片。

在本机照片选择器中:

  • 所有照片(包括我收藏的那张)都将按creationDate 排序
  • 我编辑和保存的照片将在底部,因为它是我更改的最后一张。原件将根据其创建日期在其原始位置。

在我的应用中,我执行以下操作:

PHFetchOptions *options = [PHFetchOptions new];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
options.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage];
PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:self.assetCollection options:options];

我对@9​​87654323@进行排序并得到以下结果:

  • 所有照片(包括我收藏的那张)都将按creationDate 排序
  • 根据原始创建日期,我编辑的照片将在原始照片之后。

然后我更改我的查询,而不是在creationDate 上排序,而是在modificationDate 上排序。我得到以下结果:

  • 所有照片大致顺序与creationDate几乎相同
  • 我编辑的照片将在底部。这就是我想要和喜欢的原生应用。
  • 收藏的照片也会在底部:-(

因此,Apple 似乎将 modificationDate 更改为最喜欢的动作,并且可能还会更改其他类型的动作,这会扰乱照片的排序。

如何准确地获得 Apple 在其原生应用程序中使用的排序?也许巧妙地使用了NSSortDescriptor

【问题讨论】:

    标签: ios sorting photokit phasset


    【解决方案1】:

    不要问我为什么和如何,而是当我设置那种分类描述时。它的工作方式类似于照片应用程序(最近)。

            [options setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"burstIdentifier" ascending:NO]]];
    

    试试看。

    【讨论】:

      【解决方案2】:

      正如@knutigro 所提到的,解决方案是将PHFetchResult 与默认选项一起使用,即为options 参数传入nil

      var fetchResult: PHFetchResult!
      
      override func viewDidLoad() {
          super.viewDidLoad()
      
          fetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: nil)
      }
      

      但下一步是反转排序结果,以便最近的图像排在第一位。在 PHFetchResult 中没有简单的方法来反转结果,所以我使用了以下方法:

      func assetAtIndex(index: Int) -> PHAsset {
          // Return results in reverse order
          return fetchResult[fetchResult.count - index - 1] as! PHAsset
      }
      

      【讨论】:

      • 你认为它会保持反转是安全的吗?另外,为什么 Apple 会返回从一开始就反转的结果?
      • @Husam - 在我看来,我认为他们不太可能改变它,因为如果他们这样做了,它会破坏很多应用程序,但当然不能保证。跨度>
      • @Jawwad 你提到了我!
      【解决方案3】:

      斯威夫特 3

      let fetchOptions = PHFetchOptions()
          let sortOrder = [NSSortDescriptor(key: "creationDate", ascending: false)]
          fetchOptions.sortDescriptors = sortOrder
      

      【讨论】:

      • 我用这个方法修改日期,但不起作用,仍然在照片中得到创建日期,为什么?请帮帮我
      • 这与原生照片应用程序的结果不同,它有点“添加日期”左右。对我来说,只有解决方案,根本不使用排序描述符导致与照片应用程序相同的结果。
      【解决方案4】:

      我刚刚发现要复制本机 photopicker 的确切行为,解决方案是删除我的自定义 sortDescriptior 并使用默认行为的 PHFetchResult。发现这一点后,现在看起来很明显。

      【讨论】:

      • 在多台设备上对此进行了测试,我发现顺序不正确的情况。从 iOS 9 开始,似乎无法完全匹配原生照片应用程序。
      • @jjxtra 你能说出这些不正确的情况吗?
      • 在我妻子的手机上,她有大约 20 张专辑。智能相册和普通相册都以不同的顺序返回,尽管接近匹配原生照片应用程序。
      • 这已停止在 ios12 中工作。使用此功能,iCloud 中的图像始终显示在顶部,然后是相机胶卷图像。
      • 不,还是坏了。
      【解决方案5】:

      您可以尝试使用两个排序描述符:

      NSSortDescriptor sortDesc1 = [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]; 
      
      NSSortDescriptor sortDesc2 = [NSSortDescriptor sortDescriptorWithKey:@"modificationDate" ascending:NO]];     
      
      options.sortDescriptors = @[sortDesc1, sortDesc2];
      

      没有测试过,只是觉得应该可以。

      【讨论】:

      • 是的,谢谢,它可能是一些自定义的NSSortDescriptor,但只需添加两个描述符,就像你在这里所做的那样在这种情况下不起作用。我猜第二个只有在比较两个对象时第一个相等时才适用。照片上的日期从不相等。
      • 不起作用,并且从网上下载的创建日期早于几年的照片显示在错误的位置。
      • @jjxtra 你找到解决方案了吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-10
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 2013-11-08
      • 1970-01-01
      相关资源
      最近更新 更多