2014-10-10 2 views
8

Sto lavorando a un'applicazione che si basa sulla visualizzazione di molte foto sullo schermo da più fonti.In che modo l'app IOS Foto può mostrare centinaia di foto in un'unica schermata?

Mi chiedo come potrebbe Apple rendere la visualizzazione di "foto tessera" nella loro app fotografica? Con così tante foto, a mio parere l'app dovrebbe dare un avviso di memoria con meno foto (anche se carico le foto in "dimensioni miniatura") visualizzate contemporaneamente, ma posso vedere che può mostrare centinaia di foto in una schermata quando eseguo lo zoom su.

Un modo in cui posso pensare è che queste viste non sono singole foto ma sono singole immagini "piastrellate" generate da foto in tempo reale, quindi l'app mostra solo 2-3 foto contemporaneamente. Ma questo ha ancora bisogno di un sacco di potenza della CPU e tempo per generare velocemente. Posso ingrandire o ridurre all'istante.

Desidero ottenere funzionalità simili nella mia app, qualsiasi indicazione su come ottenere questo risultato sarebbe ottima.

Grazie per le risposte.

IOS 7 Photos.app

+0

perché consumerebbe troppa memoria se le dimensioni dell'anteprima sono piccole? – dadalar

+0

@DenizAdalar perché ci sono troppe foto. anche caricare un "ALAsset" è troppo lento per caricare tante foto in tempo reale (ognuna di esse è caricata in un thread separato) secondo me. – dreampowder

+0

Ho voluto implementare qualcosa di simile qualche giorno fa, nella vista Anno, la mia vista raccolta non può scorrere senza problemi. – gabbler

risposta

10

Ho fatto qualche ricerca e ha scoperto che iOS 8 ha un meraviglioso nuovo quadro denominato "Foto quadro"

Questo quadro permette di immagini facilmente cache, chiamare le immagini in miniatura con dimensioni predefinite e elementi di carico. (la vecchia libreria ALAsset aveva solo una dimensione "miniatura", dovevi ridimensionarla.)

sul mio test uno schermo pieno di 20x20 foto (il mio schermo dello schermo contenuto 384 immagini), l'app richiede solo 10mb di memoria, e quasi senza sfarfallio durante lo scorrimento. Lo scorrimento regolare può essere ottenuto ottimizzando il caricamento delle celle.

Heres il codice che ho usato per il caricamento delle immagini in un uicollectionview con dimensioni 20x20 voce:

@import Photos; 
@interface MainViewController() 

@property (strong) PHFetchResult *assetsFetchResults; 
@property (strong) PHCachingImageManager* imageManager; 

@end 

su viewDidLoad:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.imageManager = [[PHCachingImageManager alloc] init]; 

    CGFloat scale = [UIScreen mainScreen].scale; 
    CGSize cellSize = ((UICollectionViewFlowLayout *)self.collectionViewLayout).itemSize; 
    AssetGridThumbnailSize = CGSizeMake(cellSize.width * scale, cellSize.height * scale); 

    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier]; 
    self.assetsFetchResults = [PHAsset fetchAssetsWithOptions:nil]; 
    // Do any additional setup after loading the view. 
} 

e raccolta metodi vista origine dati:

#pragma mark <UICollectionViewDataSource> 

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { 
    return 1; 
} 


- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { 
    return self.assetsFetchResults.count; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; 

    [self.imageManager requestImageForAsset:self.assetsFetchResults[indexPath.item] 
           targetSize:CGSizeMake(20, 20) 
           contentMode:PHImageContentModeAspectFill 
            options:nil resultHandler:^(UIImage *result, NSDictionary* info){ 

             UIImageView* imgView = (UIImageView*)[cell.contentView viewWithTag:999]; 
             if(!imgView) { 
              imgView = [[UIImageView alloc] initWithFrame:[cell.contentView bounds]]; 
              imgView.tag = 999; 
              [cell.contentView addSubview:imgView]; 
             } 
             imgView.image = result; 
            }]; 
    // Configure the cell 

    return cell; 
} 

Questo è tutto!

+0

Potresti fornire un progetto di esempio, ho modificato il codice delle foto da Apple, cambiando solo la dimensione della vista della raccolta a 20x20, I ottenere un utilizzo di 15.6 MB di memoria sul mio iPhone 4S, lo scorrimento non è così liscio. AssetGridThumbnailSize è 40x40 anche se la scala è 2 per 4S, quindi anche la dimensione di destinazione è 40x40 anziché 20x20. Come hai raggiunto solo 10 MB di memoria ottimizzando il ricaricamento della cella? – gabbler

+1

@CarouselMin sto anche testando su iphone4s btw, ecco il progetto: https: // github.com/dreampowder/photosSample – dreampowder

+0

Ho testato il progetto e l'utilizzo della memoria è 10mb ~ 11mb, che è meglio, solo che l'immagine è un po 'sfocata, cambiando il target Dimensione: CGSizeMake (20, 20) per targetDimensione: CGSizeMake (40, 40) rende le foto chiare, ma l'utilizzo va fino a 11 ~ 12 mb, lo scorrimento è un po 'lento, in ogni caso è migliore del codice di origine, che memorizza nella cache alcune foto durante lo scorrimento. – gabbler