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.Weight
和 ContentView.Height = View.Height
【讨论】:
【参考方案7】:似乎一种解决方案是将情节提要文件视为“iOS 6.1 及更早版本”(选择情节提要文件->文件检查器->界面生成器文档->查看方式。在此模式下定位子视图会显示偏移量。
【讨论】:
好吧,我没有使用情节提要。但是我不确定这是 ios6 到 ios7 的问题,上面的示例已经完全使用 iOS 7 创建。此外,我编辑了我的问题,它只出现(据我所知)uiscrollview 和 uitableview。 嗯很有趣...查看此内容,您可以将 variant="6xAndEarlier" 添加到文档元素的 XIB 顶部,因为这是翻转我上面提到的位时的区别。仅供参考,这个问题也发生在我的 uiwebview 上。【参考方案8】:谢谢你们的解决方案!我挣扎了好几个小时试图解决这个问题。当没有涉及导航栏时一切都很好,但是当我将 ViewController 嵌入到 NavigationController 中时,一切都变得混乱了。
我通过取消选中 Adjust Scroll View Insets 和 Under Top Bars 解决了这个问题。这两个都位于 ViewController 的属性检查器中。谢谢一百万!
【讨论】:
以上是关于IOS7:UINavigationController 中的 UIScrollView 偏移的主要内容,如果未能解决你的问题,请参考以下文章