ChatGPT解决这个技术问题 Extra ChatGPT

IOS7:UINavigationController 中的 UIScrollView 偏移

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

之前,当我们有一个导航控制器时,我们有一个这样的片段:

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

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

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

Interface Builder_________________________和结果

https://i.stack.imgur.com/JODqs.png

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

Interface Builder_________________________和结果

https://i.stack.imgur.com/RIhjR.png

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

谢谢你的帮助

编辑

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

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

s
streem

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

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 使问题更加复杂。非常感谢您终于提供了解决方案!
应用程序文档会告诉您设置 navigationbar.translucent = YES 会阻止导航栏向下推送内容。这是最大的谎言,在这篇文章之前花了我很多小时的工作。另外,必须设置 self.automaticallyAdjustsScrollViewInsets = NO;非常感谢你的这篇文章!!!!!!!苹果和苹果?
我发现这导致我的 UIScrollView 的边界向下移动导航栏的高度(-64 点)。我手动将其覆盖为 0,但发现 UISrollView 仍会在 y 轴上滚动,并“捕捉”到 -64 处的假想线。您的解决方案解决了这个问题。
M
Myxtic

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

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

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

https://i.stack.imgur.com/tDz6D.png


花了很长时间在 UIScrollView 属性而不是 View Controller 中寻找这个选项!谢谢!
B
Ben Nicholas

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


是的,这个比“调整滚动视图插图”更适合我
d
dawid

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


C
Chuy47

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

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

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

https://i.stack.imgur.com/3ELFx.jpg

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

https://i.stack.imgur.com/OEwQR.jpg

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

PD我没有使用自动布局也没有故事板

希望这可以帮助某人!


我注意到这种奇怪的行为,我相信背后的逻辑是当滚动视图是第一个孩子时,滚动视图插入会自动调整。否则它实际上没有意义,因为您的滚动视图可能不是全屏的。
B
Bista

我也面临这个问题。

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

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

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

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

https://i.stack.imgur.com/NYaKe.png


s
swhitman

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


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

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

我通过取消选中 Adjust Scroll View Insets 和 Under Top Bars 解决了这个问题。这两个都位于 ViewController 的 Attribute Inspector 中。太感谢了!