如何在iOS 7中的UINavigationController中获取UIScrollView的*实际*帧大小?

Ken*_*rty 6 cocoa-touch objective-c uiscrollview ios6 ios7

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

示例:想象一个UIViewController,它包含一个UIScrollView(self.scrollView),它可以填充整个self.viewstruts和spring,以便它总是填充self.view.现在将UIViewController嵌入到UINavigationController中,导航栏保持可见.

在iOS 6中,我观察到以下内容:

  • self.view.frame.origin= (0.0, X)where 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高度)嵌入到导航控制器中,因为self.scrollView.bounds.origin== self.scrollView.contentOffset?我是否只需为iOS 6 v.iOS 7编写不同的代码并检测正在运行的版本?

我真的不想假设屏幕是任何特定尺寸并且硬编码,因为这似乎是不好的形式......


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

截图,iOS 6 v.iOS 7 Layout

Cra*_*ens 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;
Run Code Online (Sandbox Code Playgroud)

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