加载大型 UIImage 时如何改善用户体验?

Posted

技术标签:

【中文标题】加载大型 UIImage 时如何改善用户体验?【英文标题】:How to improve user experience when loading a large UIImage? 【发布时间】:2012-10-18 09:56:10 【问题描述】:

我使用一张大图片(2000x2000,500kb)作为我 iPad 应用程序中大多数视图控制器的背景图片。

问题是应用程序似乎在第一次加载带有此类图像的子 ViewController 时冻结在父 ViewController 上(后来由于缓存我假设它更快)。

我会在单独的线程中加载它,并在加载时显示一些指示器,但是我知道所有与 UI 相关的操作都应该在主线程上完成。

有什么方法可以改善用户体验,因此应用程序似乎不会冻结大约。 2秒? (在我的情况下,平铺图像不是一种选择)

【问题讨论】:

【参考方案1】:

UIKit 的所有操作都应该在主线程上完成是错误的!只有绘制的操作应该在主线程上执行。在单独的线程中加载 UIImage 并在此之后将其交给主线程是完全节省的。但是我不认为加载需要那么长时间。我认为这可能是需要时间的绘图。

但是:UIActivityIndicatorView 在它自己的线程中运行(就像所有 CoreAnimation 动画一样),它会保持动画,即使在添加指示器后阻塞主线程也是如此。试试这个:

UIActivityIndicatorView* activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[activityIndicator startAnimating];
[self addSubview:activityIndicator];

dispatch_async(dispatch_get_main_queue(), ^
    UIImage* image = [UIImage imageNamed:@"MyImage"];
    UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
    [self addSubview:imageView];

    [activityIndicator removeFromSuperview];
);

这会启动UIActivityIndicator 并在下一个运行循环循环中开始加载图像。添加图像后,它会删除超级视图。也许您必须再次调度活动指示器的移除,以便 UIKit 有时间绘制图像。在这种情况下,但是[activityIndicator removeFromSuperview] 在另一个dispatch_async 中的第一个块内的主队列。

【讨论】:

完成了这项工作,感谢您的快速响应!是的,在谈到图像加载时,我实际上是指图像绘制

以上是关于加载大型 UIImage 时如何改善用户体验?的主要内容,如果未能解决你的问题,请参考以下文章

一个页面上有大量的图片(大型电商网站),加载很慢,你有哪些方法优化 这些图片的加载,给用户更好的体验

第07章 改善用户搜索体验

Vue按需加载提升用户体验

应用启动时加载用户配置文件,选择视图时崩溃,将 PFFile 转换为 UIImage

思科IOS中改善CLI的用户体验

区块链助力保险行业提升风控能力,改善用户体验