【问题标题】:Determine real size of UIView during UIViewController's life cycle在 UIViewController 的生命周期中确定 UIView 的实际大小
【发布时间】:2012-10-18 02:07:42
【问题描述】:

我使用的是 iOS 4.3。

我有一个 UIViewController,它的视图只有一个 UIToolbar 和一个覆盖视图其余部分的子视图。主 UIView 具有弹簧和支柱,以使其符合任何形状,子视图也是如此。 xib 默认是纵向的。

我把这个 UIViewController 放在我的 UISplitViewController 的右侧。在我显示此视图控制器之前,我的 iPad 处于横向,并且一直保持横向......所以要清楚,我不会改变方向。

xib 是 768w 和 1004h,所以我的 subview 是 768w 和 960h。

-viewDidLoad 我的子视图是 768x960。

-viewWillAppear 中,我的子视图是 768x960。

-viewDidAppear 我的子视图是 768x960。

但当我在 iPad 上实际看到它时,UISplitViewController 的右侧是 704px 宽(应该是这样),而我的视图和子视图可验证只有 704px 宽。

但是,在代码或视图控制器生命周期中,我无法查询self.view 或我的子视图并看到宽度为 704 像素。

我需要根据我的整体视图的大小进行一些更改,因为我的子视图是 UIScrollView,我想根据我的self.view 的真实大小来更改 scrollView.contentSize。

在视图控制器的生命周期中必须有某个地方可以让我获得视图的真实大小。我试过 framebounds 但它们都一直显示 768x906。

NSLog(@"scroll view frame=%@ bounds=%@", NSStringFromCGRect(self.scrollView.frame), NSStringFromCGRect(self.scrollView.bounds));

NSLog(@"view frame=%@ bounds=%@", NSStringFromCGRect(self.view.frame), NSStringFromCGRect(self.view.bounds));

UIViewController *detailVC = [self.splitViewController.viewControllers objectAtIndex:1];
NSLog(@"splitview frame=%@ bounds=%@", NSStringFromCGRect(detailVC.view.frame), NSStringFromCGRect(detailVC.view.bounds));

【问题讨论】:

  • 添加一个按钮,触发记录视图大小的操作。点击按钮是否正确?
  • 是的。在视图真正可见并且我点击一个按钮后它是正确的。
  • 无法在iOS 5或iOS 6下的模拟器上重现。小测试项目在这里:github.com/mayoff/stackoverflow-12946064viewDidAppear:中的框架是正确的。
  • 对不起,我忘了说我是在 iOS4.3 模拟器中运行的。我已经更新了我的帖子。
  • 它在 iOS 5 中的行为是否有所不同?

标签: ios uiviewcontroller uiscrollview


【解决方案1】:

您应该使用 UIViewController 方法viewWillLayoutSubviews。这是更新滚动视图的最佳位置。

请记住,您的视图控制器将以纵向启动。在某些时候,它会旋转到横向。出于调试目的,您可能希望覆盖 willRotateToInterfaceOrientation:duration:didRotateFromInterfaceOrientation: 方法。

【讨论】:

  • 对不起,我忘了说我需要这个才能在 iOS4 中工作,而 viewWillLayoutSubviews 在 iOS4 中不存在。
猜你喜欢
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多