ios - 如何避免 viewWillAppear 和 viewDidAppear 之间的延迟

标签 ios objective-c uiviewcontroller delay

我正在开发 iPad 应用程序。我有一些 UIViewController (viewController) 和启用了分页的 UIScrollView (scrollView)。我将一些子 UIViewControllers(childVC_1、childVC_2)添加到 scrollView。

每个 childVC 几乎占据整个屏幕,并有 5-10 个大图像作为 subview 。我无法加载所有需要的 childVCs 并将它们存储在内存中,所以我只先添加 child VC。我想动态添加下一个 childVC 并删除前一个,以保持内存清洁。我已经异步预加载了下一个 childVC 所需的所有图像,并将它们存储在一些 NSArray(图像)中。所有图像均已渲染。

- (UIImage *)renderedImageFromImage:(UIImage *)image
{
    UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0);
    CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
    [image drawInRect:rect];
    UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return renderedImage;
}

我想在用户开始滚动时添加下一个 childVC。我用预加载的图像初始化 childVC。添加 subview Controller 很常见。

    childVC = [[ChildVC alloc] initWithImages:images];
    [self addChildViewController:childVC];
    [self.scrollView addSubview:childVC.view];
    childVC.view.frame = CGRectMake(xCoord, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height);
    [childVC didMoveToParentViewController:self];

我希望它会很快,因为我已经预加载了所有需要的图像。我在 childVC 的 viewDidLoad 方法中有一些日志,一切都非常快。但是 viewWillAppear 和 viewDidAppear 之间有很大的延迟(大约半秒)。

我不知道这两种方法之间到底发生了什么,我也不知道我还能做些什么来让它更快。希望有人有一些想法。

最佳答案

在滚动过程中,尽量不要在 View 层次结构中添加或删除 View 。如果您可以重复使用 ScrollView 中已有的 View ,请更改内容并重新排列框架。 (因此,例如,如果您向下滚动,查看顶部不再可见的 View ,请更改内容并将其移动到当前位置下方。

根据我的经验,调用 addSubviewremoveFromSuperView 会在滚动期间增加小的延迟。

关于ios - 如何避免 viewWillAppear 和 viewDidAppear 之间的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24607564/

相关文章:

iphone - 将计时器保持打开并使用标志来控制执行开/关有什么问题吗?

iphone - 缺少 UIView 的 anchorPoint 属性

ios - MVYSideMenu 在所有 View Controller iOS 中使用导航 Controller

iphone - viewWillDisappear 和 viewDidDisappear 永远不会被调用

ios - renderInContext 翻转 colorWithPatternImage 的原点

ios - 想要列出 iOS(和 Mac)的 Xcode 宏和预处理器符号

ios - 动态物体之间的 Box2d 碰撞

objective-c - 通过将另一个字符串重复给定次数来创建 NSString

objective-c - 保留一个 UIViewControllers's.view,然后释放 VC,VC 得到 dealloc'd?

ios - 从应用程序中的任何位置移动到 Root View