22

我正在开发我的应用程序以使用 iOS7。我有一个 UINavigationController 我正在推动一个 UIViewController 里面有一个 ScrollView。在scrollView 里面我有一个tableView。当我在 scrollView 内滚动 tableView 时,是否有可能实现该列表将出现在该状态栏的后面。如果我有一个 UINavigationController 和一个带有 tableView 的 UIViewController 也是一样的。

所以这是层次结构:

UINavigationController-> UIViewController-> UIScrollView-> UITableView

我希望当用户滚动表格时,顶部的单元格将在状态栏下可见。

如果没有UIScrollView,它会在 iOS7 中自动发生。

谢谢。

4

9 回答 9

38

只需在 viewController init 方法中设置automaticallyAdjustsScrollViewInsets为。NO

在 Storyboard 中,您可以在选择 UIViewController 时直接在属性面板中切换属性。

如果您使用 xib,只需像这样设置它:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self.automaticallyAdjustsScrollViewInsets = NO;
}

注意:这从 iOS7 开始是正确的,并且仍然在 iOS8 中。

于 2014-12-30T06:13:01.850 回答
36

以上都对我不起作用,直到我注意到我必须在 interfacebuilder 中将 Content Insets 从 Automatically 设置为 Never:

在此处输入图像描述

于 2017-11-07T05:07:40.027 回答
27

从 iOS 11 开始,您可以将此新属性与后备 (Swift 4) 一起使用:

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
} else {
    self.automaticallyAdjustsScrollViewInsets = false
}
于 2017-11-10T11:17:47.073 回答
5

Skoua 的回答可能在某些情况下有效,但对 iOS11 及更高版本确实有一定的副作用。最值得注意的是,滚动视图将开始向其子级传播安全区域,如果您使用安全区域或布局边距,这可能会在滚动时弄乱您的布局。

Apple 在这个 WWDC 会议中很好地详细解释了这一点,并且还明确提到它contentInsetAdjustmentBehavior = .never可能会产生副作用,并且在大多数情况下不应该使用。


要获得一个不会弄乱我们的布局但在状态栏(或导航栏)下方显示其内容的滚动视图,您应该观察滚动视图的安全区域并相应地调整您的自定义内容插图:

private var scrollViewSafeAreaObserver: NSKeyValueObservation!

override func viewDidLoad() {

    ...

    if #available(iOS 11.0, *) {
        self.scrollViewSafeAreaObserver = self.scrollView.observe(\.safeAreaInsets) { [weak self] (_, _) in
            self?.scrollViewSafeAreaInsetsDidChange()
        }
    } else {
        self.automaticallyAdjustsScrollViewInsets = false
    }
}

@available(iOS 11.0, *)
func scrollViewSafeAreaInsetsDidChange() {
    self.scrollView.contentInset.top = -self.scrollView.safeAreaInsets.top
}

deinit {
    self.scrollViewSafeAreaObserver?.invalidate()
    self.scrollViewSafeAreaObserver = nil
}

为什么这行得通?因为我们离开了contentInsetAdjustmentBehavior = .automatic。当涉及到滚动和非滚动轴时,这将为我们提供正常的行为,但 UIScrollView 也会将任何安全区域“转换”为内容插入。由于我们不希望它用于我们的顶部边缘,我们只需将负顶部安全区域设置为我们的自定义插入,这将抵消滚动视图设置的任何插入。

于 2019-07-01T09:51:01.960 回答
3

这只是苹果的愚蠢。还要担心一种奇怪的行为。无论如何,我最终将顶部的滚动视图内容插图设置为-20(来自 IB)。

于 2013-12-30T12:35:28.997 回答
1

我找到了解决方案!只需设置:

self.automaticallyAdjustsScrollViewInsets = false

在具有 UIScrollView 的视图控制器上。

于 2017-07-18T10:42:42.583 回答
0

You probably has seen this recommendation a thousand times but, check the 'The Status Bar' section on the iOS 7 transition guide(can't post the direct link here).

Blunt resuming, on ios7 the status bar is part of the view. This means that almost anything you put on your view, will be under the bar, unless you say the contrary. A work around i found for that problem was making the status bar opaque.

Another way could be disabling the status bar on that specific view. Like on this thread.

于 2013-11-06T16:57:14.723 回答
0

我遇到过类似的问题,我发现为了确保我的滚动视图内容不会出现在状态栏下方,我应用了setContentInset.

因此,在您的情况下,如果您使用插图,我会建议使用 UIScrollViewDelegatescrollViewDidScroll根据您的表格视图量身定制。如果发生滚动,请忽略滚动视图插图。

于 2014-01-30T17:10:25.197 回答
0

不隐藏statusBar,scrollView不会跳转

于 2018-07-02T03:24:55.067 回答