2015-07-29 10 views
8

Sto cercando di riprodurre il photopicker nativo di iOS8 usando Photos framework. Ho un problema con lo smistamento.Ordinamento di foto esattamente come photoapp nativo con PhotoKit

Diciamo Io seguente:

  1. posso modificare una foto in Camera + app e salvarlo torna alla gallery.
  2. Ho preferito un'altra foto.

Nella photopicker origini:

  • Tutte le foto (anche quello che ho Preferito) verranno ordinati per creationDate
  • La foto che ho modificato e salvato sarà giù in fondo in quanto era la l'ultimo che ho cambiato. L'originale sarà nella posizione originale in base alla data di creazione.

Nella mia app Io seguente:

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

I sorta in creationDate e ottenere seguente risultato:

  • Tutte le foto (anche quello che ho Preferito) verranno ordinati per creationDate
  • La foto che ho modificato sarà subito dopo al suo originale in base alla data di creazione originale.

Quindi ho cambiato la mia query così invece di ordinare su creationDate, ordino su modificationDate. Ottengo seguente risultato:

  • Tutte le foto sono in generale per quasi uguale creationDate
  • La foto che ho modificato verrà in fondo. Questo è ciò che voglio e mi piace nell'app nativa.
  • La foto Preferito sarà anche in fondo :-(

Così seeme di Apple cambiamento modificationDate sull'azione preferito e probabilmente anche su altri tipi di azioni e questo rovinare l'ordinamento delle foto.

Come è possibile ottenere esattamente l'ordinamento di Apple usa nella sua applicazione nativa Forse alcuni uso intelligente di NSSortDescriptor

risposta

4

Ho appena scoperto che per copiare il comportamento esatto del photopicker nativo la soluzione era rimuovere il mio custom sortDescriptior e utilizzare semplicemente il PHFetchResult con il comportamento predefinito. Sembra così ovvio ora dopo averlo scoperto.

+1

Dopo aver provato questo su diversi dispositivi, vedo casi in cui l'ordine non è corretto. A partire da iOS 9 non c'è modo di abbinare esattamente l'app nativa alle foto. – jjxtra

+0

@jjxtra Puoi dire quali sono questi casi errati? – kolyuchiy

+1

Sul mio telefono da mogli ha circa 20 album. Sia gli album intelligenti sia gli album normali tornano in un ordine diverso, anche se vicino alla corrispondenza, l'app nativa delle foto. – jjxtra

2

si può provare a utilizzare due descrittori di ordinamento:??

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

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

options.sortDescriptors = @[sortDesc1, sortDesc2]; 

Non ho provato, ho pensato che potesse funzionare.

+0

Sì, grazie, la sua, probabilmente un po 'di abitudine 'NSSortDescriptor', ma solo con l'aggiunta due descrittori, come hai fatto qui, non funziona in questo caso. Immagino che il secondo si applicherà solo se il primo è uguale quando vengono confrontati due oggetti. Le date non sono mai uguali sulle foto. – knutigro

+0

Non funziona e le foto vengono scaricate dal Web con date di creazione precedenti di anni precedenti nel punto sbagliato. – jjxtra

4

Come @knutigro ha menzionato la soluzione è utilizzare PHFetchResult con le opzioni predefinite i.e.passando nil per il parametro options:

var fetchResult: PHFetchResult! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    fetchResult = PHAsset.fetchAssetsWithMediaType(.Image, options: nil) 
} 

Ma il passo successivo è invertendo i risultati di ordinamento in modo che l'immagine più recente è prima. Non c'è un modo semplice per invertire i risultati in PHFetchResult così ho usato il seguente metodo:

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

Pensi che sia sicuro dire che rimarrà invertito? Inoltre, perché Apple restituisce i risultati invertiti dal primo posto? –

+0

@Husam - A mio parere, non penso sia probabile che lo cambieranno, perché se lo facessero, si rompono molte app, ma ovviamente non c'è alcuna garanzia. – Jawwad

+0

@Jawwad mi hai nominato! – Husam

4

rapida 3

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

Ho usato questo metodo per modificaData ma non funziona e continuo a creareDato in foto perché? mi aiuti per favore –

Problemi correlati