Come determinare la dimensione massima dell'immagine PHAsset
disponibile su un dispositivo iOS, dove per "disponibile" si intende attualmente sul dispositivo, non richiede alcun download di rete dalla libreria di foto di iCloud ?Determinare la dimensione dell'immagine PHAsset più grande disponibile sul dispositivo iOS
Ho sviluppato un'app in cui una raccolta di miniature è mostrata in un UICollectionView
(molto simile all'app Foto) e quindi un utente può selezionare un'immagine per vederla a schermo intero. L'immagine a dimensione intera viene scaricata da iCloud se necessario. Tuttavia, voglio mostrare all'utente la versione più grande possibile dell'immagine fino a quando non è disponibile la dimensione completa.
Il modo in cui la foto quadro funziona è piuttosto strana:
Nella vista raccolta, sto usando un PHCachingImageManager
a cache (e più tardi request) le immagini con un targetSize
di 186x186 pixel (il doppio dei UICollectionViewCell
dimensioni a causa della ridimensionamento della retina).
Questo funziona molto bene, con uno scorrimento molto veloce e nessun ritardo nel riempimento delle celle con le immagini. Controllando la dimensione delle immagini restituite, sono tutte approssimativamente 342x256 pixel. Questo è sul mio iPhone 6 con iCloud Photo Library abilitato e 'Optimize Storage' abilitato, quindi solo piccole anteprime sono memorizzate sul dispositivo per la maggior parte delle immagini.
Tuttavia, la parte strana è che se io quindi richiedere il full size (o molto più grande) versione di qualsiasi immagine, sia con PHCachingImageManager
o PHImageManager.defaultManager()
utilizzando l'opzione PHImageRequestOptionsDeliveryMode.Opportunistic
, la prima immagine (bassa qualità) che viene restituito è un piccolo francobollo da 60x45 pixel che sembra orribile a tutto schermo, fino a quando l'immagine a dimensione intera viene scaricata per sostituirla.
Chiaramente ci sono miniature più grandi (342x256) sul dispositivo già, come sono stati appena mostrati nella visualizzazione insieme! Allora perché diavolo non li restituisce come la prima immagine di "bassa qualità" fino a quando non è stata scaricata la dimensione completa? Per assicurarmi che le immagini 342x256 fossero già presenti sul dispositivo, ho eseguito il codice in modalità aereo, quindi nessun accesso alla rete stava accadendo.
Quello che ho trovato è che se ho richiesto qualsiasi dimensione fino a 256x256 avrei ottenuto le immagini 342x256 restituite. Non appena ho ingrandito (anche 1 pixel) mi restituirei 60x45 immagini e poi provare a scaricare l'immagine a dimensione intera.
Ho modificato il mio codice per fare prima una richiesta 256x256, seguita da una richiesta a dimensione intera con PHImageRequestOptionsDeliveryMode.HighQualityFormat
(che non restituisce una piccola immagine intermedia), e che funziona magnificamente. È anche ciò che deve fare l'app Foto iOS poiché visualizza miniature di alta qualità mentre scarica l'immagine completa.
Quindi, con questo background, come faccio a sapere qual è la dimensione più grande dell'immagine del dispositivo per un PHAsset
? 256x256 è un numero magico o dipende dal modo in cui iCloud Photo Library sta ottimizzando lo spazio (in base alle dimensioni della libreria e alla memoria disponibile del dispositivo)?
Certamente sembra un bug che Photos Framework non restituisca l'immagine più grande attualmente disponibile (quando viene richiesta una dimensione maggiore di quella attuale), e che per ottenere la dimensione più grande che ha, è necessario chiedere che taglia o più piccola, perché se chiedi più grande, otterrai una miniatura 60x45! Bizzarro.
UPDATE: rapporto Bug presentato ad Apple: https://openradar.appspot.com/25181601
progetto di esempio che dimostra l'errore: https://github.com/mluisbrown/PhotoKitBug
Durante il recupero delle anteprime si esegue una richiesta sincrona o asincrona con PHImageManager.defaultManager()? –
@ArunAmmannaya Sto usando un 'PHCachingImageManager' per ottenere le anteprime e la richiesta è asincrona. – mluisbrown
Quindi si suppone di ottenere più richiamata per singola immagine con dimensioni diverse per l'immagine richiesta. Quante volte viene richiamato il callback? –