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

use*_*880 15 iphone status uiscrollview ios7

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

这就是层次结构:

UINavigationController- > UIViewController- > UIScrollView- > UITableView.

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

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

谢谢.

小智 36

只需在viewController init方法中设置automaticallyAdjustsScrollViewInsets即可NO.

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

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

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

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

  • 这是正确的解决方案,因为它不依赖于状态栏高度,它不总是20px(取决于正在通话的电话等). (2认同)

MQL*_*QLN 31

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

在此输入图像描述

  • 我还必须取消选中“Extend Edges: Under Top Bars” (2认同)

Sko*_*oua 25

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

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


Bla*_*olf 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
}
Run Code Online (Sandbox Code Playgroud)

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


xic*_*aio 0

您可能已经看过此建议一千次,但是,请查看 iOS 7 过渡指南上的“状态栏”部分(无法在此处发布直接链接)。

直接恢复,在ios7上状态栏是视图的一部分。这意味着您提出的几乎所有内容都将受到限制,除非您提出相反的说法。我发现解决该问题的一个解决方法是使状态栏不透明。

另一种方法可能是禁用该特定视图上的状态栏。就像这个线程一样