ios UICollectionView 滚动缓慢和内存警告
ios UICollectionView slow scrolling and memory warning
我目前正在做一个涉及 UICollectionView
的项目,该项目由从 UIImagepickerController 导入的 AVAssets
填充,在集合中有 10 个左右的项目后,滚动变得迟缓和缓慢,偶尔我收到内存警告。我相信问题出在实时发生的缩略图生成中,这是我使用的代码:
- (void) setAsset:(AVAsset *)asset
{
_asset = asset;
AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:_asset];
NSError *err = NULL;
CMTime time = CMTimeMake(1, 60);
generate.appliesPreferredTrackTransform = YES;
CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
self.VideoImageView.image = [UIImage imageWithCGImage:(imgRef)];
}
还有一个less "expensive way" 可以毫不拖延地做到这一点吗?
任何有关此事的帮助将不胜感激。
可以在后台线程做实时缩略图生成,等操作完成后再跳回主线程设置实际缩略图。
现在您正在主线程上执行所有操作,这会阻塞 UI,并导致滚动不稳定。
您可以在单元格中设置占位符图像并在后台队列中生成缩略图。
然后将其设置为您的图像视图。
AsynImageView可能对你有用。
另外开一个线程处理图片的事情。当您的图像完成后切换回主线程以更新单元格。你可以用 GCD
下面是异步生成视频缩略图的代码。
-(void)generateImage
{
NSURL *url = [NSURL fileURLWithPath:_videoPath];
AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform=TRUE;
CMTime thumbTime = CMTimeMakeWithSeconds(30,30);
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
if (result != AVAssetImageGeneratorSucceeded) {
NSLog(@"couldn't generate thumbnail, error:%@", error);
}
// TODO Do something with the image
};
CGSize maxSize = CGSizeMake(128, 128);
generator.maximumSize = maxSize;
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];
}
希望对您有所帮助。
我目前正在做一个涉及 UICollectionView
的项目,该项目由从 UIImagepickerController 导入的 AVAssets
填充,在集合中有 10 个左右的项目后,滚动变得迟缓和缓慢,偶尔我收到内存警告。我相信问题出在实时发生的缩略图生成中,这是我使用的代码:
- (void) setAsset:(AVAsset *)asset
{
_asset = asset;
AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:_asset];
NSError *err = NULL;
CMTime time = CMTimeMake(1, 60);
generate.appliesPreferredTrackTransform = YES;
CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
self.VideoImageView.image = [UIImage imageWithCGImage:(imgRef)];
}
还有一个less "expensive way" 可以毫不拖延地做到这一点吗? 任何有关此事的帮助将不胜感激。
可以在后台线程做实时缩略图生成,等操作完成后再跳回主线程设置实际缩略图。
现在您正在主线程上执行所有操作,这会阻塞 UI,并导致滚动不稳定。
您可以在单元格中设置占位符图像并在后台队列中生成缩略图。 然后将其设置为您的图像视图。
AsynImageView可能对你有用。
另外开一个线程处理图片的事情。当您的图像完成后切换回主线程以更新单元格。你可以用 GCD
下面是异步生成视频缩略图的代码。
-(void)generateImage
{
NSURL *url = [NSURL fileURLWithPath:_videoPath];
AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform=TRUE;
CMTime thumbTime = CMTimeMakeWithSeconds(30,30);
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
if (result != AVAssetImageGeneratorSucceeded) {
NSLog(@"couldn't generate thumbnail, error:%@", error);
}
// TODO Do something with the image
};
CGSize maxSize = CGSizeMake(128, 128);
generator.maximumSize = maxSize;
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];
}
希望对您有所帮助。