【问题标题】:How to get *actual* frame size for UIScrollView in UINavigationController in iOS 7?如何在 iOS 7 的 UINavigationController 中获取 UIScrollView 的 *实际 * 帧大小?
【发布时间】:2013-11-07 05:29:45
【问题描述】:

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

示例: 想象一个 UIViewController,它包含一个 UIScrollView (self.scrollView),它填充整个 self.view,并带有支柱和弹簧,因此它总是填充 self.view。现在将该 UIViewController 嵌入到 UINavigationController 中,并且导航栏保持可见。

在 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.bounds.origin == self.scrollView.contentOffset,鉴于上述观察结果,我如何在 iOS 7 中获得 self.scrollView 的实际尺寸(宽 x 高)?我是否只需为 iOS 6 v. iOS 7 编写不同的代码并检测正在运行的版本?

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


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

【问题讨论】:

  • 为了清楚起见,您要求的区域不是滚动视图的“实际大小(宽度 x 高度)”;框架正在为您提供该问题的正确答案。

标签: objective-c cocoa-touch ios6 uiscrollview ios7


【解决方案1】:

发生的情况是您的UITableView 正在自动调整,以便在iOS 7 上UINavigationBar 后面的内容可见。这是通过更改UIScrollView 中的contentInset 属性来完成的。所以要得到不包括导航/状态栏后面部分的框架,你只需要考虑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。

【讨论】:

  • +1。我唯一要注意的是,使用下拉刷新或其他操作 contentInset 的东西可能会导致行为不端,具体取决于生成的框架的用途。
【解决方案2】:

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

【讨论】:

  • 嗨:这样做似乎只是使滚动视图全屏(在导航栏后面),因此第一项被遮挡。有没有办法简单地获取滚动视图的非遮挡部分的 CGRect ?我对 iOS 7 中的内容插图很好。
  • 我猜另一个问题是:我是否应该覆盖 iOS 7 的默认布局策略以实现更像 iOS 6 的布局,然后设置 self.tableView.clipsToBounds = NO 以便保持导航栏的透明效果?
猜你喜欢
  • 2014-04-11
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多