iOS7 UIScrollView在状态栏下方显示偏移量内容

时间:2013-11-06 15:59:56

标签: iphone uiscrollview ios7 status

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

所以这就是层次结构:

UINavigationController - > UIViewController - > UIScrollView - > UITableView

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

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

感谢。

9 个答案:

答案 0 :(得分:34)

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

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

如果您使用xib,只需将其设置为:

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

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

答案 1 :(得分:24)

以上都没有为我工作,直到我注意到我必须在界面构建器中将内容插件从自动设置为从不:

enter image description here

答案 2 :(得分:22)

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

if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
}
else
{
    self.automaticallyAdjustsScrollViewInsets = false
}

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

self.automaticallyAdjustsScrollViewInsets = false

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

答案 5 :(得分:0)

你可能已经看过这个推荐一千次但是,请查看iOS 7过渡指南中的“状态栏”部分(不能在此处发布直接链接)。

Blunt恢复,在ios7上,状态栏是视图的一部分。这意味着除非你说的相反,否则几乎所有你放在你视线上的东西都会被置于标准之下。我发现该问题的一个方法是使状态栏不透明。

另一种方法是禁用该特定视图上的状态栏。 Like on this thread

答案 6 :(得分:0)

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

因此,在您的情况下,如果您使用的是inset,我会使用针对您的tableview定制的UIScrollViewDelegatescrollViewDidScroll建议。如果正在进行滚动,请忽略滚动视图插入。

答案 7 :(得分:0)

不要隐藏statusBar,scrollView不会跳转

答案 8 :(得分:0)

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

Apple在this WWDC session中对此进行了很好而详尽的解释,还明确提到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还将“转换”任何安全区域为内容插图。由于我们不想在顶部边缘使用此设置,因此我们只需将负的顶部安全区域设置为自定义插图,即可抵消滚动视图设置的任何插图。