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

标签 ios ipad cocoa-touch uiview uiviewcontroller

我在我的 iPad 应用程序中使用大图片 (2000x2000, 500kb) 作为大多数 View Controller 的背景图像。

问题是应用程序似乎在第一次使用这样的图像加载子 ViewController 时卡住在父 ViewController 上(我假设由于缓存,稍后它会更快)。

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

有什么方法可以改善用户体验,使该应用程序似乎不会卡住大约 5 分钟。 2秒? (在我的情况下不能选择平铺图像)

最佳答案

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

但是:由于 UIActivityIndi​​catorView 在其自己的线程中运行(与所有 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];
});

这将启动一个 UIActivityIndi​​cator 并在下一个运行循环周期中开始加载图像。添加图像后,它会删除 super View 。也许你必须再次调度事件指示器的移除,以便 UIKit 有时间绘制图像。在这种情况下,但是 [activityIndi​​cator removeFromSuperview] 在另一个 dispatch_async 到第一个 block 内的主队列。

关于ios - 如何在加载大型 UIImage 时改善用户体验?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12951915/

相关文章:

ios - 底部没有额外高度的 UIWebView contentInset

objective-c - CATiledLayer : Render zoomable PDF Page - what are "LevelsOfDetail" and "LevelsOfDetailBias"?

ios - Swift ios解析json数据只获取选中的数据

ios - SwiftUI iOS 14 Picker宽度无法更改

iphone - 检测以兼容模式在 iPad 上运行的 iPhone 应用程序

iphone - 复制 Roambi 应用程序的 Cardex View

ios - 使 UIPickerView 结果导入文本到 UILabel

java - 是否有低级 Swift 类可以在 AWS S3 中上传文件

iphone - 如何去除移动 webkit 上图像周围的白色边框?

iphone - YouTube WebView - 视频 ID