【问题标题】:UISearchBar on UITableView strange offset issueUITableView 上的 UISearchBar 奇怪的偏移问题
【发布时间】:2014-06-20 20:52:42
【问题描述】:

我有一个UITableView,它有一个UISearchBar 子视图。这一切都在 UIViewController 的视图以及其他一些子视图(标签、文本字段等)上。

表格的搜索栏和内容偏移量表现得很奇怪,但它似乎取决于这些视图添加到 xib 中的主视图的顺序。我创建了一个示例项目,其中只有我的表/搜索和一个标签以进行测试,结果是相同的。在标签之后添加表格时,一切正常:

设置:

正确和预期的结果:

但是,如果我只是更改我的 2 个子视图在主视图上的顺序(也就是在标签之前添加的表格 ),那么奇怪的事情就会开始发生。

显然设置错误:

搜索栏的奇怪偏移:

我没有改变任何其他东西,那么为什么 Xcode 似乎关心这些子视图添加到主视图的顺序?如果我在“坏”表格设置上向上滚动,搜索栏会立即在其顶部边缘消失,但表格的内容将继续向上滚动,直到它到达在 xib 中设置的框架的顶部。向下滚动,直到奇怪的降低位置,搜索栏才会重新出现。这是在 Xcode 5.1.1 中,而不是新的 beta 版本。无论是否打开自动布局,结果都是一样的。

知道为什么会这样吗?这是一个错误,还是我错过了什么? (我没有发布任何代码,因为我所做的只是设置节数、行数并设置单元格上的文本。没有弄乱内容插入、偏移等任何内容。我从应用程序委托加载视图为导航控制器的根目录)

【问题讨论】:

  • 请在tableViewCell或tableView headerView上添加SearchBar。

标签: ios objective-c uitableview uisearchbar


【解决方案1】:

发生这种情况是因为 UIViewController 的属性名为 automaticallyAdjustsScrollViewInsets

在 iOS 7 中,UIViewControllers 有一个名为 automaticAdjustsScrollViewInsets,默认为 YES。如果你 有一个滚动视图,它是您的视图的根视图 控制器(例如使用 UITableViewController)或子视图 index 0,那么该属性将同时调整 contentInset 和 scrollIndicatorInsets。这将允许您的滚动视图开始其 导航栏下方的内容和滚动指示器(如果您的视图 控制器位于导航控制器中)。

来自Big Nerd Ranch

如果您使用故事板,您可以通过选择视图控制器并在属性检查器中取消选择 Adjust scroll view insets 来更改它。

这是来自apple documentation的描述:

默认值为YES,允许视图控制器调整它的 滚动视图插入以响应屏幕区域所消耗的 状态栏、导航栏和工具栏或标签栏。如果你设置为 NO 想要自己管理滚动视图插图调整,例如何时 视图层次结构中有多个滚动视图。

【讨论】:

  • 您能否更具体地说明此选项的位置?我在视图控制器、表格视图或搜索栏(带或不带自动布局)的属性检查器中看不到它
  • 我发现你不会在 xib 文件中看到它。它只会显示在故事板中。巴士仍然可以在'-ViewDidLoad`中设置'automaticallyAdjustsScrollViewInsets'属性
  • 因此,这确实根据它在 xib 中的设置方式将表放置在正确的位置(无论添加的顺序如何)。我仍然很好奇为什么会根据 xib 中子视图的顺序发生这种情况。第二次添加表格时,滚动视图插图是否自动调整似乎是正确的。为什么只有表在前才需要设置?
  • 它仅适用于索引 0 处的滚动视图(作为子视图)或作为 UITableViewController 之类的根视图。这个link 证实了我的理论。
  • 这似乎是我正在寻找的信息!如果您将此信息移到您的答案中,我会将其标记为已回答/悬赏。
【解决方案2】:

关于tableview 和searchbar 的位置,我之前也有同样的问题。我尝试了以下方法,它对我有用。

如果您不为此编写代码并且只是 xib 或故事板的问题,请尝试所有插座的自动调整大小和原点设置以修复其位置并查看差异。它可能对你有用。

【讨论】:

  • 这并不能解决问题。此外,我知道如何解决这个问题(在表格之前订购其他子视图)我的问题是为什么要这样做。
【解决方案3】:

更新:automaticallyAdjustsScrollViewInsets 在 ios 11 中已被弃用,并引入了一个新字段 contentInsetAdjustmentBehavior

if #available(iOS 11.0, *) {
    tableview.contentInsetAdjustmentBehavior = .never
} else {
    automaticallyAdjustsScrollViewInsets = false
}

【讨论】:

    【解决方案4】:

    UITableView header只能包含一个UIView,所以如果你需要UISearchBar和UILabel,你需要将它们包装到UIView中,并将这个view添加为UITableView header。

    【讨论】:

    • 标签不在表格视图上,它直接坐在主视图上。
    猜你喜欢
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    相关资源
    最近更新 更多