UIViewController方法viewDidLoad / viewWillHappen - 查看帧大小检测

时间:2013-12-01 17:16:01

标签: ios iphone objective-c uiview

我已经编写了一些代码,它们适用于UIViewController的视图并将其映像到视图中。该代码应该是iPhone屏幕独立的,只要iPhone 4和5之间的高度不同。

      self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
      self.view.clipsToBounds = YES;
      UIGraphicsBeginImageContext(self.view.frame.size);
      [[UIImage imageNamed:@"myimage.png"] drawInRect:self.view.bounds];


      UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
      UIGraphicsEndImageContext();
      UIView *imageView = [[UIView alloc] initWithFrame:CGRectMake(0,0,      self.view.frame.size.width, self.view.frame.size.height)];
      imageView.backgroundColor = [UIColor colorWithPatternImage:image];
      [self.view addSubview: imageView];

      image =  nil;
      imageView = nil;

我发现当我将此代码添加到viewDidLoad方法时,代码无法检测到不同的窗口大小。但是当我将它放在viewWillAppear中时,代码确实可以正确处理两种屏幕尺寸。我不明白为什么。

有人知道为什么会这样吗?我想了解它。

感谢

3 个答案:

答案 0 :(得分:1)

发生这种情况是因为在加载视图时,其内容未必布局且未知大小。使用autolayout系统时尤其如此。基本步骤是,

  1. 视图已加载
  2. 系统使用您在故事板或代码中提供的约束来布置视图
  3. 视图显示
  4. 所以放置它的最合适的地方似乎是viewDidLayoutSubviews。在那时,视图及其子视图已经布局,并且大小在那里。但是将它放在viewWillAppear(或viewDidAppear,就此而言)可以工作,虽然不太正确。

答案 1 :(得分:0)

在创建视图控制器的根视图时调用viewDidLoad方法。此时,它未添加到窗口层次结构中,并且尚未执行自动布局。这就是你看到这种行为的原因。

这就是说为什么要在图形上下文中绘制图像?只需使用UIImageView即可显示图像。

答案 2 :(得分:0)

你在做什么几乎是正确的。正如其他人所说,在viewDidLoad中,视图控制器视图的最终大小尚未设置。正确的解决方案是正确设置子视图autoresizingMask

UIView *imageView = [[UIView alloc] initWithFrame:CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height)];
imageView.backgroundColor = [UIColor colorWithPatternImage:image];
imageView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self.view addSubview: imageView];

这假设您希望图像视图填充视图控制器的视图。

另一种解决方案是使用viewWillLayoutSubviews方法更新子视图的帧。