gpt4 book ai didi

ios - IOS 照片应用程序如何在一个屏幕上显示数百张照片?

转载 作者:技术小花猫 更新时间:2023-10-29 11:18:44 27 4
gpt4 key购买 nike

我正在开发一个依赖于在屏幕上显示来自多个来源的大量照片的应用程序。

我想知道苹果如何在他们的照片应用程序中制作“照片图 block ” View ?有那么多照片,在我看来,应用程序应该发出内存警告,同时显示更少的照片(即使我以“缩略图大小”加载照片),但我可以看到当我缩放时它可以在一个屏幕上显示数百张照片出去。

我能想到的一种方式是,这些 View 不是单张照片,而是根据照片实时生成的单个“平铺”图像,因此该应用一次只能显示 2-3 张照片。但这仍然需要大量的 CPU 功率和时间才能快速生成。我可以立即放大或缩小。

我想在我的应用程序中实现类似的功能,任何关于如何实现这一目标的指导都会很棒。

感谢您的回答。

IOS 7 Photos.app

最佳答案

我做了一些研究,发现IOS8有一个很棒的新框架,叫做“Photos Framework”

此框架可让您轻松地缓存图像、调用具有预定义大小的缩略图和加载项目。 (旧的 ALAsset 库只有一个“缩略图”大小,您必须调整自己的大小。)

在我的测试中,屏幕上满是 20x20 张照片(我的手机屏幕内容为 384 张图像),应用程序仅占用 10mb 的内存,滚动时几乎没有闪烁。可以通过优化单元格重新加载 imo 来实现平滑滚动。

这是我用来将图像加载到项目大小为 20x20 的 uicollectionview 中的代码:

@import Photos;
@interface MainViewController ()

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

@end

在 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.
}

和 Collection View 数据源方法:

#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;
}

就是这样!

关于ios - IOS 照片应用程序如何在一个屏幕上显示数百张照片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26297836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com