19

写真フレームワークを使用してネイティブの iOS8 フォトピッカーを再現しようとしています。並べ替えに問題がありました。

私が次のことをするとしましょう:

  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];

並べ替えてcreationDate、次の結果を取得します。

  • すべての写真 (お気に入りの写真も含む) は、creationDate
  • 私が編集した写真は、元の作成日に従って元の直後になります。

次に、クエリを変更して、 でソートする代わりに でソートcreationDatemodificationDateます。次の結果が得られます。

  • すべての写真は、一般的に次の順序とほぼ同じです。creationDate
  • 編集した写真は一番下になります。これは私がネイティブアプリで望んでいることです。
  • お気に入りの写真も一番下になります:-(

そのため、ApplemodificationDateはお気に入りのアクションを変更し、おそらく他の種類のアクションも変更したようで、これにより写真の並べ替えが台無しになります。

Appleがネイティブアプリで使用するソートを正確に取得するにはどうすればよいですか? 多分いくつかの賢い使用NSSortDescriptor?

4

5 に答える 5

9

スイフト3

let fetchOptions = PHFetchOptions()
    let sortOrder = [NSSortDescriptor(key: "creationDate", ascending: false)]
    fetchOptions.sortDescriptors = sortOrder
于 2017-04-27T03:50:24.213 に答える
8

ネイティブのフォトピッカーの正確な動作をコピーするには、カスタムを削除してデフォルトの動作をsortDescriptior使用するだけで解決できることがわかりました。PHFetchResultそれを発見した後、それはとても明白に思えます。

于 2015-07-29T11:22:40.087 に答える
5

@knutigro が述べたように、解決策はPHFetchResultデフォルトのオプションを使用することです。つまりniloptionsパラメーターを渡すことです。

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
}
于 2016-09-22T17:32:33.260 に答える
2

2 つのソート記述子を使用してみてください。

NSSortDescriptor sortDesc1 = [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]]; 

NSSortDescriptor sortDesc2 = [NSSortDescriptor sortDescriptorWithKey:@"modificationDate" ascending:NO]];     

options.sortDescriptors = @[sortDesc1, sortDesc2];

テストしていませんが、うまくいくかもしれないと思っただけです。

于 2015-07-29T09:50:06.363 に答える