ios7所有搜索视图和表格视图关闭20像素

Posted

技术标签:

【中文标题】ios7所有搜索视图和表格视图关闭20像素【英文标题】:ios7 all searchviews and tableviews off by 20 pixels 【发布时间】:2013-09-13 22:11:00 【问题描述】:

编辑:这不是框架的问题。框架在正确的位置。这是关闭的内容。是的,我们正在补偿清除状态栏。 ViewDidLoad 显示内容偏移量为 0,0。

在具有滚动视图的应用程序的每个页面上,它的内容都被下推 20 像素。我认为这可能与新的 StatusBar 或缺少它有关。该错误似乎也存在于模拟器设置菜单中。截图如下。这似乎只影响添加到 ViewController 的第一个滚动视图,并且只有在没有其他视图添加到它的情况下。表视图也受到影响,因为它们继承自 Scroll 视图。需要明确的是,滚动视图从正确的原点开始,但内容被下推 20 像素。这很奇怪,因为我认为如果这是一个状态栏问题,它会高于而不是低于 20 像素。

目前我们正在通过将它添加到我们的基本视图控制器来修复它

UIView *hackView = [[UIView alloc] init];
hackView.frame = CGRectMake(0, 0, 0, 0);
[self.view addSubview:hackView];

显然,这是一个 hack。

在为最新的 ios7 构建时,即使使用 IOS7 的黄金会员版本,手机和模拟器也会发生同样的事情。您甚至可以在模拟器的设置表视图以及下面的我们的设置中看到错误示例。

这是加载后的屏幕截图。我们注意到的一件奇怪的事情是,当我们执行拉动刷新时,它会更正滚动视图并停留在正确的位置。或者,如果我们进行补偿,它在开始时看起来是正确的,但任何后续拉动刷新都会将滚动视图迁移到 -20px

【问题讨论】:

【参考方案1】:

在 Xcode 中进一步测试后,我原来的解决方法仍然有效,但真正的罪魁祸首似乎是导航控制器与视图控制器上的 Adjust Scroll View Insets 标志相结合。禁用它可以解决问题。

[self setAutomaticallyAdjustsScrollViewInsets:NO];

原始解决方法:尝试重新排序视图层次结构或在顶部添加一个空视图。

这发生在我身上,似乎当 UIScrollView 或类似的子类在层次结构中首先出现时,它会偏移 20 个像素(以防止它碰到状态栏)。然而,即使有问题的视图远不靠近顶部,这种情况仍然会发生。

这在 Interface Builder 中是可重现的,对我来说一个简单的解决方法是重新排列我的视图,以便标签或按钮首先位于视图控制器的视图下。如果在您的情况下这是不可能的,那么在您的滚动视图上方添加一个空视图(甚至在屏幕外)似乎也可以解决问题。

【讨论】:

很好的答案,但尝试添加几行代码来演示您的方法。它总是很感激 setAutomaticallyAdjustsScrollViewInsets 在界面生成器中也可用。【参考方案2】:

我在viewDidLoad: 中将它添加到我的 UIViewControllers 中,它受到了影响,它为我解决了这个问题:

NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"7.0" options: NSNumericSearch];
if (order == NSOrderedSame || order == NSOrderedDescending)

    // OS version >= 7.0
    self.edgesForExtendedLayout = UIRectEdgeNone;

另一种更简洁的方法:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

【讨论】:

明天我到办公室试试这个。如果它解决了我的问题,我会告诉你。感谢您的回复!您是否发现将其添加到未受影响的视图有任何负面影响?我有一个我使用的 View 基类。我正在考虑将其添加到那里以将修复程序应用于我的所有视图,无论他们是否有问题。 我将它添加到我的标签 UIViewControllers 以及一些模态 UIViewControllers 中,我根本没有看到任何负面影响。【参考方案3】:

你是如何表达你的观点的?使用自动布局,您可以使用topLayoutGuide,它应该能够适应这些偏移。

【讨论】:

一切都在代码中,我们手工计算一切。我们还没有切换到 AutoLayout。自动布局也会影响内容吗?根据我的理解(我可能是错的),这只会影响容器的框架而不一定是内容。 我不知道 - 我遇到了类似的问题,我通过使用 topLayoutGuide 的自动布局解决了这些问题。对不起。 无需抱歉。我只是表达我的担忧。无论如何,我现在都需要实现自动布局,因为我试图避免它,因为它是一个大的代码大修。 (我们所有的观点都是用代码制作的,我们有更大的问题)如果这是解决方案,我一定会给予你信任。 是的,通常还有更重要的事情——但自动布局过渡非常有益。在 Xcode 5 的 Storyboards 中,约束最终是有用的(Xcode 并没有试图太聪明地放入你不想要的约束)——只有你添加的东西实际上是存在的。如果您想使用代码,我实际上正在编写一些 Autolayout-shortcut 方法,我计划将其放在 github 上(当我这样做时会在此处发布链接)。但是NSLayoutConstraints 本身很容易处理(但我很懒,所以我写了 lib)。 抱歉耽搁了,但这里是在代码中创建自动布局约束的快捷方式:github.com/czechboy0/DUIToolbox#constraint-factory 希望你觉得它有用,如果你想要更多用例,请告诉我。跨度> 【参考方案4】:

在 Ios 7 中,视图从 y=0 的窗口开始,将视图移动到 20 像素向下

self.view.frame = CGRectmake (0,20,320,hight);

这是由于 iOS 7 中的透明状态栏。

下拉视图以正确显示它。

【讨论】:

这不是问题。我们正在对此进行补偿。框架在正确的位置。不是滚动视图中的内容。

以上是关于ios7所有搜索视图和表格视图关闭20像素的主要内容,如果未能解决你的问题,请参考以下文章

关闭模态视图控制器时,所有主视图内容向上移动 20px

无法在表视图中列出数据 [关闭]

iOS 7 静态表格视图选择样式错误

关闭 ViewController 后,我的视图保持在 iOS7 中以前的视图控制器方向

IOS 7表格视图内容大小问题

关闭两个模态(表格)视图控制器