将 `UIView` 添加为子视图最初很慢

Posted

技术标签:

【中文标题】将 `UIView` 添加为子视图最初很慢【英文标题】:Adding a `UIView` as a subview is initially slow 【发布时间】:2013-01-05 22:47:32 【问题描述】:

在我名为MainViewControllerUIViewController 中,我引用了另一个名为SubViewControllerUIViewController。定义如下:

@class SubViewController;

@interface MainViewController : UIViewController <UIScrollViewDelegate> 
  SubViewController * _subViewController;

在我的MainViewControllerinitWithNibName:bundle: 方法中,我初始化我的SubViewController 如下:

#pragma mark - Init

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; 
  if((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]))
    _subViewController = [[SubViewController alloc] initWithNibName:@"SubViewController" bundle:nil[;

    // Forces the view to load, in an attempt to speed up the adding of the subview.
    UIView * view = _subViewController.view;
    view.alpha = 1.0f;
  
  return self;

确实调用了SubViewControllerviewDidLoad 方法,并且似乎所有内容都已加载,但是当我将SubViewController 添加为子视图时:

- (IBAction)showButtonPressed:(UIButton *)aButton; 
  [self.view addSubview:_subViewController.view];

应用程序慢了几秒钟,然后添加了子视图,一切都很好。奇怪的是,当我删除子视图并尝试重新添加它时,没有延迟

我认为问题是加载问题,但我找不到任何有关如何解决此问题的文档。

谁能解释一下是什么导致了这个速度变慢?谢谢!

【问题讨论】:

几秒钟是真的很长的时间。您可能希望使用 Instruments 来确定发生了什么,而不是只查看视图加载。 我同意,这 真的很长一段时间。仪器可悲地告诉我什么。有什么特别要找的吗? 在仪器上,运行时间分析器,启动应用程序,您应该会看到一个峰值。停止它,然后在下面的区域中,继续单击左侧毫秒数最高的三角形。最终你应该得到一些可以理解的东西。 【参考方案1】:

你的代码不完整!!

我尝试使用您的代码并创建新项目 -ARC- 对我来说毫不拖延 尝试使用 Instruments 来查找发生了什么

【讨论】:

显然SubViewController 的布局中有更多代码。例如,它有一个UIScrollView,我在UIViews 上添加了一些。我想知道是否其他人也有类似的问题。【参考方案2】:

我从来没有遇到过这样的问题。因为您说如果您不加载第二个视图,它的工作速度会更快。检查以查看 secondViewController 的 viewWillAppear 和 viewDidAppear 中的内容

【讨论】:

以上是关于将 `UIView` 添加为子视图最初很慢的主要内容,如果未能解决你的问题,请参考以下文章

将 UIView 添加为子视图并在 Swift 中确定它们在视图层次结构中的位置

自定义 UIView(.xib) 在 UITableViewCell 中添加为子视图后自动更改框架

添加为子视图后,ScrollView 不会滚动

WKWebView 添加为子视图

从同一个 xib 加载另一个 UIView 以添加为子视图

为子视图的子视图设置框架