我正在开发我的应用程序以使用iOS7。 我有一个UINavigationController我正在推动一个内部有ScrollView的UIViewController。在scrollView里面我有一个tableView。 是否有可能实现这一点,当我在scrollView中滚动tableView时,列表将出现在状态栏后面。同样的原因,如果我有一个UINavigationController和一个带有tableView的UIViewController。
所以这就是层次结构:
UINavigationController
- > UIViewController
- > UIScrollView
- > UITableView
。
我希望当用户滚动表格时,顶部的单元格将在状态栏下显示。
如果没有UIScrollView
,它会在iOS7中自动发生。
感谢。
答案 0 :(得分:34)
只需在viewController init方法中将automaticallyAdjustsScrollViewInsets
设置为NO
。
在Storyboard中,您可以在选择UIViewController时直接在属性面板中切换属性。
如果您使用xib,只需将其设置为:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self.automaticallyAdjustsScrollViewInsets = NO;
}
注意:这是从iOS7开始的,仍然在iOS8中。
答案 1 :(得分:24)
答案 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定制的UIScrollViewDelegate
或scrollViewDidScroll
建议。如果正在进行滚动,请忽略滚动视图插入。
答案 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还将“转换”任何安全区域为内容插图。由于我们不想在顶部边缘使用此设置,因此我们只需将负的顶部安全区域设置为自定义插图,即可抵消滚动视图设置的任何插图。