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!
perché consumerebbe troppa memoria se le dimensioni dell'anteprima sono piccole? – dadalar
@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
Ho voluto implementare qualcosa di simile qualche giorno fa, nella vista Anno, la mia vista raccolta non può scorrere senza problemi. – gabbler