IOS7:UINavigationController 中的 UIScrollView 偏移

Posted

技术标签:

【中文标题】IOS7:UINavigationController 中的 UIScrollView 偏移【英文标题】:IOS7 : UIScrollView offset in UINavigationController 【发布时间】:2013-09-28 20:34:49 【问题描述】:

我目前正在将我的应用程序迁移到 ios 7 上,并且我已经在新的导航控制器/栏管理上卡了几个小时。

以前,当我们有一个导航控制器时,我们有一个像这样的 sn-p:

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

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

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

Interface Builder_________________________和结果

现在,如果我将状态栏设置为无,顶部没有偏移,但由于导航栏导致模拟器上的视图更小,界面构建器中视图的底部被切断。

界面生成器_________________________以及结果

我想我真的在这里遗漏了一些东西,但我在 iOS7 过渡指南中找不到任何主题或苹果信息。

感谢您的帮助

编辑

在图片中我们可以看到,视图的第一个子视图是一个包含两个标签的 UIScrollView,当没有滚动视图时问题不会出现。如果它是 UITableView,它也会出现。 如果标签在 UIScrollView 之外,则该标签没有偏移。

【问题讨论】:

如果不是,您可能需要使用自动布局,因此您可以确保某些视图与屏幕的顶部/底部/侧面保持一定距离 我确实没有使用 Autolayout,但是使用它(勾选复选框)并不能解决问题。 使用自动布局,您必须设置约束以使视图保持在原位。 Xcode 不会自动知道你想要什么。 看到您之前的编辑,我刚刚发现了您的问题。不幸的是,这不是最明显的解决方案。我没有试图重新解释它,而是使用 Youtube 上的这个视频来学习如何设置滚动视图。 youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be 祝你好运。我花了好几次才完全理解他在做什么。 【参考方案1】:

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

self.automaticallyAdjustsScrollViewInsets = false

虽然我不太了解这个属性的真正好处,(或者为什么默认值为 true)

我找到的唯一文档是:

https://web.archive.org/web/20160405135605/https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html https://developer.apple.com/documentation/uikit/uiviewcontroller/1621372-automaticallyadjustsscrollviewin

更新

在 iOS 11 中 automaticallyAdjustsScrollViewInsets 已弃用

你现在应该使用:

self.tableView.contentInsetAdjustmentBehavior = .never

我也鼓励您查看this question 及其答案,以更好地了解这些属性

【讨论】:

很棒的发现。故事板中的 UIScrollView 真的很复杂。我希望 Apple 在 Xcode 的未来版本中让它变得更加无缝。 此代码阻止我的UIScrollView 滚动。但如果没有这个,我就无法摆脱偏移量。奇怪... 这个标志也可以在你的故事板/笔尖中关闭,视图控制器有一个“调整滚动视图插图”复选框。很长时间以来,我一直在努力解决滚动视图和自动布局方面的问题,支持 iOS 6 和 7 使问题更加复杂。非常感谢您终于提供了解决方案! App 文档会告诉你设置 navigationbar.translucent = YES 会阻止导航栏下推内容。这是最大的谎言,在这篇文章之前花费了我很多小时的工作。另外,必须设置 self.automaticallyAdjustsScrollViewInsets = NO;非常感谢你的这篇文章!!!!!!!苹果和苹果? 我发现这导致我的 UIScrollView 的边界向下移动导航栏的高度(-64 点)。我手动将其覆盖为 0,但发现 UISrollView 仍会在 y 轴上滚动,并“捕捉”到 -64 处的假想线。您的解决方案解决了这个问题。【参考方案2】:

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

只是想补充一点,这个设置也可以从界面生成器中轻松调整。

    选择你的视图控制器 单击“属性检查器”选项卡 取消选中“调整滚动视图插图” 享受吧!

【讨论】:

花了很长时间在 UIScrollView 属性而不是视图控制器中寻找这个选项!谢谢!【参考方案3】:

我遇到了同样的问题,但我在界面构建器中的 ViewController 上发现了一个相当奇怪的属性,这似乎对我造成了这种影响。有一组“扩展边缘”复选框。我删除了“Under Top Bars”检查,一切都开始为我正确布局。

【讨论】:

是的,这个比“调整滚动视图插图”更适合我【参考方案4】:

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

【讨论】:

【参考方案5】:

我遇到了类似的问题,在关闭 viewController 后,tableView 中的 contentOffset 更改为 (0, -64)。

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

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

我在 ImageView 之后移动了 tableView 并且它起作用了:

似乎将表格视图放在第一个位置会导致问题,将表格视图移动到另一个位置可以解决问题。

P.D.我没有使用 autoLayout 也没有故事板

希望这可以帮助某人!

【讨论】:

我注意到了这种奇怪的行为,我相信背后的逻辑是当滚动视图是第一个孩子时,滚动视图插入会自动调整。否则它真的没有意义,因为你的滚动视图可能不是全屏的。【参考方案6】:

我也面临这个问题。

UIScrollView 内容大小由 OS 计算为其他大小,由约束系统提供的来源 - 这就是 OS 存在疑问的原因。

如何解决 - 您应该明确定义 UIScrollView 的内容大小:

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

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

【讨论】:

【参考方案7】:

似乎一种解决方案是将情节提要文件视为“iOS 6.1 及更早版本”(选择情节提要文件->文件检查器->界面生成器文档->查看方式。在此模式下定位子视图会显示偏移量。

【讨论】:

好吧,我没有使用情节提要。但是我不确定这是 ios6 到 ios7 的问题,上面的示例已经完全使用 iOS 7 创建。此外,我编辑了我的问题,它只出现(据我所知)uiscrollview 和 uitableview。 嗯很有趣...查看此内容,您可以将 variant="6xAndEarlier" 添加到文档元素的 XIB 顶部,因为这是翻转我上面提到的位时的区别。仅供参考,这个问题也发生在我的 uiwebview 上。【参考方案8】:

谢谢你们的解决方案!我挣扎了好几个小时试图解决这个问题。当没有涉及导航栏时一切都很好,但是当我将 ViewController 嵌入到 NavigationController 中时,一切都变得混乱了。

我通过取消选中 Adjust Scroll View InsetsUnder Top Bars 解决了这个问题。这两个都位于 ViewController 的属性检查器中。谢谢一百万!

【讨论】:

以上是关于IOS7:UINavigationController 中的 UIScrollView 偏移的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 风格

全屏显示 ViewController

多控制器

UINavigationControllerDelegate 不起作用

viewController 出现时出现黑色

UINavigationController & SplitViewController