6

因此,与 iOS 7 相比,iOS 7 导航控制器中的视图框架的定义似乎大不相同(在我看来,这很奇怪)......

示例:想象一个 UIViewController 包含一个 UIScrollView( ),该 UIScrollView()用 struts 和 springsself.scrollView填充整个结构,因此它总是填充. 现在将 UIViewController 嵌入到 UINavigationController 中,并且导航栏保持可见。self.viewself.view

在 iOS 6 中,我观察到以下情况:

  • self.view.frame.origin=(0.0, X)其中X= 状态栏的高度(包含时间、信号栏等 = 20.0
  • self.view.frame.size.height= self.view.bounds.size.height= 总高度减去self.navigationController.navigationBar.frame.size.height
  • self.scrollView.frame.origin= self.scrollView.bounds.origin=(0.0, 0.0)

在 iOS 7 中,我观察到以下情况:

  • self.view.frame.origin = (0.0, 0.0)
  • self.view.frame.size.height= self.view.bounds.size.height= 整体高度(即嵌入导航控制器时高度不会降低)
  • self.scrollView.bounds.origin= (0.0, -1 * self.navigationController.navigationBar.frame.size.height),但是self.scrollView.frame.origin=(0.0, 0.0)

我的猜测是这样做是为了让内容可以在导航栏下方继续,以便导航栏可以显示最轻微的模糊 + 透明度,如 iOS 7。

问题:由于== self.scrollView,鉴于上述观察结果,当 iOS 7 嵌入导航控制器时,如何获得其实际大小(宽度 x 高度)?我是否只需为 iOS 6 v. iOS 7 编写不同的代码并检测正在运行的版本?self.scrollView.bounds.originself.scrollView.contentOffset

我真的不想假设屏幕是任何特定大小并对其进行硬编码,因为这看起来很糟糕......


更新1:我已经上传了我想问的草图。请注意,这种情况下的正确答案是416.0,这在 iOS 6 中很容易获得,但我不确定如何在 iOS 7 中获得它而不求助于假设。

屏幕截图,iOS 6 与 iOS 7 布局

4

2 回答 2

9

正在发生的事情是您UITableView正在自动调整,以便内容将UINavigationBar在 iOS 7 的后面可见。这是通过更改在contentInset中找到的属性来完成的UIScrollView。因此,要获得不包括导航/状态栏后面部分的框架,您只需要考虑contentInset.

CGRect frame = self.tableView.frame;
frame.origin.y += self.tableView.contentInset.top
frame.size.height -= self.tableView.contentInset.top;

此代码也适用于 iOS 6,因为self.tableView.contentInset.top默认为 0。

于 2013-11-07T18:21:51.680 回答
0

在 iOS7 上,需要UIScrollView.contentInset.bottom/top根据UIViewController.bottomLayoutGuide/topLayoutGuide.length.

于 2013-11-07T10:30:12.200 回答