ios – 平滑滚动500张图像

ios – 平滑滚动500张图像,第1张

概述超级编辑: 好的,经过几次不同的修改,我有一个更明确的问题.基本上我在努力使用NSCache.我有一个集合视图,你可以在下面看到,我希望能够最大限度地减少图像滚动延迟,这是我大部分时间都在做的.困难的部分是移动到全尺寸图像.这是另一种观点,我希望过渡到全尺寸照片以及Apple使用他们的照片应用程序. 似乎Apple正在缓存图像并以不同方式访问它们.我发现我需要加载原始缩略图然后在下载完整尺寸图像 超级编辑:

好的,经过几次不同的修改,我有一个更明确的问题.基本上我在努力使用NSCache.我有一个集合视图,你可以在下面看到,我希望能够最大限度地减少图像的滚动延迟,这是我大部分时间都在做的.困难的部分是移动到全尺寸图像.这是另一种观点,我希望过渡到全尺寸照片以及Apple使用他们的照片应用程序.

似乎Apple正在缓存图像并以不同方式访问它们.我发现我需要加载原始缩略图然后在下载完整尺寸图像时我可以替换它.但我不知道该怎么做.

到目前为止我所拥有的是:

UICollectionvIEw

- (voID)vIEwDIDLoad{    [super vIEwDIDLoad];    // Do any additional setup after loading the vIEw.    self.myCache = [[NSCache alloc] init];}//Reusable cell structure- (UICollectionVIEwCell *)collectionVIEw:(UICollectionVIEw *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {    //cell    CoverPhotoCell *cell = [cv dequeueReusableCellWithReuseIDentifIEr:@"CoverimgCell" forIndexPath:indexPath];    cell.backgroundcolor = [UIcolor blackcolor];    cell.clipsToBounds = YES;    cell.opaque = YES;    cell.layer.shouldRasterize = YES;    cell.layer.rasterizationScale = [UIScreen mainScreen].scale;    Media *object = [[Media alloc] init];    object = [self.photoListArray objectAtIndex:indexPath.item];    //Remove old cell    for (UIVIEw *subvIEw in [cell subvIEws]){        if (subvIEw.tag != 0 )        {            [subvIEw removeFromSupervIEw];        }    }    //UIImage    UIImage *thumbimg = [_myCache objectForKey:object.url];    if (thumbimg) {        cell.imageVIEw.image = thumbimg;    }    else {        cell.imageVIEw.image = nil;        UIImage *thumbimg = [[UIImage alloc] initWithCGImage:[object.asset aspectRatiothumbnail]];        dispatch_async(dispatch_get_main_queue(),^{            cell.imageVIEw.image = thumbimg;        });        [_myCache setobject:thumbimg forKey:object.url];    }    //thumbnail    cell.imageVIEw.tag = indexPath.row + 1;    cell.imageVIEw.layer.borderWIDth = 5;    cell.imageVIEw.layer.bordercolor = [UIcolor whitecolor].CGcolor;    cell.imageVIEw.contentMode = UIVIEwContentModeScaleAspectFit;    cell.imageVIEw.frame = CGRectMake(0,125,125);    return cell;}//User taps image- (voID)prepareForSegue:(UIStoryboardSegue *)segue sender:(ID)sender{    if ([segue.IDentifIEr isEqualToString:@"PhotoSegue"]) {        DetailPageController *controller = segue.destinationVIEwController;        NSIndexPath *selectedindex = [self.collectionVIEw indexPathsForSelectedItems][0];        controller.initialindex = (NSUInteger)selectedindex.item;        controller.photos = self.photoListArray;    }}

这就是我的NSCache代码,然后我使用segue到全视图控制器,显示全分辨率照片.如何先加载缩略图然后再加载完整尺寸的图像.

还有任何关于苹果如何快速加载图像的想法?他们使用不同的缓存方式吗?或者我做错了什么.

精制编辑:

有人可以发布或者至少指向一些示例代码,我会在用户快速滚动时显示缩略图并在速度减慢时加载实际图像,类似于我猜苹果电影预告片应用.

解决方法 完整的代码答案对于SO来说太过分了.所以我试着描述一下基础知识:

您应该创建自己的图像缓存.使用页面滚动视图,最多可以看到两个图像.在启用分页的滚动视图中查看照片时,图像缓存必须至少保存三个完整大小的图像.

缓存的工作方式如下:

假设您有一个图像列表,可以通过索引访问该索引,该索引对应于“相册查看器”的滚动视图中的位置.

从当前索引(异步)将图像加载到索引1,索引和索引1的缓存中,除非此图像已存在于缓存中或索引超出范围.

当用户开始滚动时,下一个图像将变为可见.

当用户向前滚动并滚动半页时,当前索引将增加1.此时,可以看到两个图像 – 每个图像的一半.现在,当索引更改时,将图像抛出当前索引-2并将当前索引1处的下一个图像加载.

当用户向后滚动时,索引将减1.抛出at索引2并为当前索引1加载相应的图像.

您可以通过添加一个与上面完全相同的拇指视图缓存来改进该方案,但使用更宽的范围,比如提前加载20个图像.当尚未加载完整大小的图像时,使用拇指图像作为“占位符”(注意:一切都应该是异步的).

如果用户“快速”滚动,请不要加载全尺寸图像,只需等到速度降低到一定量即可.您可以通过一些努力来确定滚动的速度.

如果用户滚动得非常快,那么即使拇指图像在显示时也不可用.然后,使用静态占位符图像. (另外注意不要用拇指图像覆盖全尺寸图像).

总结

以上是内存溢出为你收集整理的ios – 平滑滚动500张图像全部内容,希望文章能够帮你解决ios – 平滑滚动500张图像所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1074496.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存