iOS7:UINavigationController中的UIScrollView偏移量


126

我目前正在ios 7上迁移我的应用程序,并且在新的Navigationcontroller / bar管理上已经停留了几个小时。

以前,当我们有一个导航控制器时,我们有一个如下代码段:

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

在界面生成器中,我们可以选择为视图设置现有的导航栏,并且所有内容都与真实视图的内容匹配。

好的,现在,我不知道如何使用界面生成器进行正确的设计。我仍然有片段来初始化我的navcontroller。但是在MainViewController的界面构建器中,如果将状态栏设置为半透明或不透明的导航栏,则顶部的偏移为44px(请参见下文)。


界面生成器_________________________和结果


现在,如果我将状态栏设置为none,则顶部没有偏移,但是由于导航栏,模拟器上的视图较小,因此界面生成器中视图的底部被切除。

界面生成器_________________________和结果

我想我确实在这里遗漏了一些东西,但是我无法在iOS7 Transitions Guide中找到有关此主题的任何信息。

谢谢你的帮助


编辑

正如我们在图片中看到的,视图的第一个孩子是同时包含两个标签的UIScrollView,当没有scrollview时不会出现此问题。如果它是UITableView,也会出现。如果标签在UIScrollView外部,则该标签没有偏移。


如果您不希望使用自动布局,则可以使用它,因此可以确保某些视图距屏幕的顶部/底部/侧面一定距离
erdekhayser 2013年

我确实没有使用自动版式,但是使用它(选中复选框)不能解决问题。
streem

使用“自动布局”时,必须设置约束才能使视图保持原样。Xcode不自动知道您想要什么。
erdekhayser 2013年

看到您以前的编辑,我才发现您的问题。不幸的是,这不是最明显的解决方案。我没有尝试再次解释它,而是在Youtube上使用了该视频来学习如何设置滚动视图。youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be祝你好运。我花了好几次时间才能完全了解他在做什么。
erdekhayser 2013年

Answers:


286

确定,所以我找到了解决方案,我在控制器中设置了属性:

self.automaticallyAdjustsScrollViewInsets = false

不过,我不太了解此属性的真正好处(或为什么默认值为true)

我发现的唯一文档是:

更新资料

在iOS 11中 automaticallyAdjustsScrollViewInsets中已弃用

您现在应该使用:

self.tableView.contentInsetAdjustmentBehavior = .never

我也鼓励您检查此问题及其答案,以更好地了解这些属性


12
很棒的发现。情节提要中的UIScrollView确实很复杂。我希望Apple在将来的Xcode版本中使它变得无缝。
p0lAris

4
此代码阻止我UIScrollView滚动。但是没有这个,我就无法摆脱抵消。奇怪...
scaryguy 2014年

9
也可以在情节提要/笔尖中关闭此标志,视图控制器具有“调整滚动视图插图”复选框。很久以来,我一直在想办法解决滚动视图和自动布局的问题,并通过支持iOS 6和7使问题更加复杂。非常感谢您最终提供了解决方案!
Newtz 2014年

2
应用程序文档会告诉您,设置navigationbar.translucent = YES会阻止Navigationbar下推内容。这是最大的谎言,在我发此职位之前,我花了许多时间工作。另外,您必须设置self.automaticallyAdjustsScrollViewInsets = NO; 非常感谢你的这篇文章!!!!!!!苹果和苹果?
user779764 2014年

我发现这导致UIScrollView的边界向下移动了导航栏的高度(-64点)。我手动将其改写为0,但发现UISrollView仍将在y轴上滚动,并“快照”到-64处的假想线。您的解决方案解决了这个问题。
gdbj 2014年

92

@Justafinger的回答对我来说也很有吸引力。

只是想补充一点,也可以从界面构建器轻松调整此设置。

  1. 选择您的视图控制器
  2. 点击“属性检查器”标签
  3. 取消选中“调整滚动视图插图”
  4. 请享用!

在此处输入图片说明


花了很长时间在UIScrollView属性而不是View Controller中寻找此选项!谢谢!
多米尼克·威廉姆斯

11

我遇到了同样的问题,但是我在界面生成器的ViewController上发现了一个相当奇怪的属性,似乎对我来说是造成此问题的原因。有一组“扩展边缘”复选框。我删除了“ Under Top Bars”检查,一切都开始对我正确地布置。


是的,这对我来说比“调整滚动视图插图”对我的效果更好
Dmytro 2016年

2

在将autoAdjustsScrollViewInsets自动设置为YES(默认设置)的情况下,ios6和ios7之间的滚动视图位置不匹配,因此要使它们一致,您需要禁用此设置。但是,如果自动遇到ios6,ios6将会崩溃,因此您需要根据ios7进行对autoAdjustsScrollViewInsets的程序化更改,或者使用情节提要/ NIB关闭该选项


2

我有一个类似的问题,解雇了一个viewController之后,我的tableView的contentOffset更改为(0,-64)。

我的解决方案有点怪异,我尝试了所有其他答案,但没有成功,唯一解决我问题的方法是切换.xib控件树中的tableView位置

它是父视图中的第一个控件,如下所示:

之前

我将tableView移到ImageView之后,它可以正常工作:

后

似乎将表格视图放在第一个位置会引起麻烦,而将表格视图移到另一个位置可以解决此问题。

PD我既没有使用autoLayout也没有使用故事板

希望这可以帮助某人!


我注意到这种奇怪的行为,我相信背后的逻辑是,当scrollview是第一个孩子时,scrollViewInsets会自动调整。否则,这实际上没有任何意义,因为滚动视图可能不是全屏显示。
streem

1

我也面临这个问题。

UIScrollView 内容大小是由OS与其他大小(由约束系统提供的来源)计算得出的-这就是OS令人怀疑的原因。

解决方法-您应明确定义以下内容的大小UIScrollView

  1. 将可滚动内容嵌入到UIView(我将其重命名为ContentView
  2. 添加约束:

ContentView.Weight = View.WeightContentView.Height = View.Height

在此处输入图片说明


0

解决方法似乎是将情节提要文件查看为“ iOS 6.1及更早版本”(选择情节提要文件->文件检查器-> Interface Builder文档->查看为。在此模式下放置子视图会显示偏移量。


好吧,我不使用情节提要。但是我不确定这是一个ios6到ios7的问题,上面的示例已使用iOS 7完全创建。此外,我编辑了问题,据我所知,它仅在uiscrollview和uitableview中出现。
streem

嗯,很有趣。。。您可以在document元素的XIB顶部添加variant =“ 6xAndEarlier”,因为这是翻转我上面提到的位时的区别。仅供参考,这个问题也适用于uiwebview。
swhitman 2013年

0

谢谢你们的解决方案!我费了好几个小时才能解决问题。没有导航栏时,一切正常,但是当我将ViewController嵌入NavigationController时,一切就变了。

我通过取消选中“ 调整滚动视图插图”“顶部下方的栏”来解决此问题。这两个都位于ViewController的Attribute Inspector中。太感谢了!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.