TableView 滚动底层顶栏

TableView scroll underlying top bar

自从我将我的应用程序更新到 iOS 7 个新 GUI 后,我遇到了无法解决的问题。

我的应用包含一个可滚动的 TableView。问题是 TableView 在顶部栏下方滚动,这意味着 table 不考虑顶部栏并延伸到顶部并且很难看。

我尝试删除 "Extend edges under Top Bars" 上的检查,但还是一样。

我该如何解决这个问题?

一个解决方案是:将 table 视图的 contentInsetscrollIndicatorInsets 的顶部插入设置为 20。table 视图仍会覆盖状态栏,但是一直滚动时会完全可见

如果您不喜欢该解决方案,并且希望在状态栏后面有一个永久空白区域,则必须更改 pin/position table 视图顶部的方式,允许状态栏。如何执行此操作取决于您是否使用自动布局。如果你是,只需固定到顶部布局指南。如果不是,则必须使用 nib 编辑器中提供的 "delta" 字段。

但是,如果您使用的是 UITableViewController,则您不负责 table 视图的顶部;它是一个全屏视图,也是视图控制器的主视图。实际上,这是一个非常麻烦的情况。我采用了两种解决方案:

  • 将整个东西放入 UINavigationController 中,以便让导航栏对我来说 "run interference"。

  • 或者,将 table 视图控制器嵌入到自定义父视图控制器中,以便我可以定位 table 视图的顶部。

在 UINavigationController 中,我创建了一个 UIView,它位于状态栏下方但位于嵌入控制器(Table)之前,因此 table 消失在该视图后面,状态栏始终位于顶部。

var patch: UIView!

override func viewDidLoad() {
    super.viewDidLoad()

    patch = UIView(frame: CGRectMake(0, 0, view.bounds.width, 20))
    patch.backgroundColor = UIColor.redColor()
    self.view.addSubview(patch)
}

然后我让它在屏幕进入横向时消失(在 iOS9 中,状态栏在横向时自动消失)并在屏幕进入纵向时让它重新出现。

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    if UIDevice.currentDevice().orientation.isLandscape.boolValue {
        patch.hidden = true
    } else {
        patch.hidden = false
    }
}