UITableView 上的 UISearchBar 偏移问题奇怪

10

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

搜索栏和表格的内容偏移行为非常奇怪,但似乎取决于这些视图在xib中添加到主视图的顺序。 我创建了一个只包含我的表格/搜索和一个标签的样本项目进行测试,结果相同。 当表格在标签之后添加时,一切正常:

设置:

table added after label

正确和预期的结果:

Proper expected result

然而,如果我只是改变我的两个子视图在主视图上的顺序(即在标签之前添加表格),那么奇怪的事情就开始发生了。

显然不良设置:

Table added before label

搜索栏的奇怪偏移:

wtf is this?!?!

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

您有没有想过为什么会发生这种情况?这是一个 bug 吗,还是我漏掉了什么?(我没有发布任何代码,因为我所做的只是设置节、行的数量并在单元格上设置文本。不涉及内容插图、偏移量等。我从应用程序委托中加载视图作为导航控制器的根)


请在tableViewCell或tableView的headerView上添加SearchBar。 - Vineesh TP
4个回答

16
这是因为UIViewController的一个属性叫做automaticallyAdjustsScrollViewInsets
在iOS 7中,UIViewControllers有一个名为automaticallyAdjustsScrollViewInsets的属性,默认值为YES。如果您有一个滚动视图,它要么是您的视图控制器的根视图(例如UITableViewController),要么是子视图位于索引0,则该属性将调整contentInset和scrollIndicatorInsets。这将使您的滚动视图从导航栏下方开始其内容和滚动指示器(如果您的视图控制器在导航控制器中)。
来自Big Nerd Ranch
如果您使用storyboards,可以通过选择视图控制器并在属性检查器中取消选择Adjust scroll view insets来更改它。
这是apple documentation的描述:
默认值为YES,这允许视图控制器根据状态栏、导航栏、工具栏或选项卡栏消耗的屏幕区域调整其滚动视图插图。如果您想自己管理滚动视图插图调整(例如当视图层次结构中有多个滚动视图时),请将其设置为NO。

你能不能更具体地说明这个选项在哪里?我在视图控制器、表格视图或搜索栏的属性检查器中都没有看到它(无论是否使用自动布局)。 - Stonz2
我发现你在xib文件中看不到它,只会在storyboard中显示。但是你仍然可以在“-ViewDidLoad”中设置“automaticallyAdjustsScrollViewInsets”属性。 - Mustafa Ahmed
它只适用于滚动视图(作为子视图)的索引0或作为根视图,如UITableViewController。这个链接证实了我的理论:http://www.bignerdranch.com/blog/designing-interfaces-ios-6-ios-7/。 - Mustafa Ahmed
这似乎是我正在寻找的信息!如果您将此信息移至您的答案中,我会将其标记为已回答/奖励。 - Stonz2
@Stonz2,这个答案没有被标记为悬赏。你能否请标记一下? - Mustafa Ahmed
显示剩余3条评论

1

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

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

1

我之前遇到了关于TableView和SearchBar位置的问题。我尝试了以下方法,对我来说很有效。

如果你没有编写代码,而仅仅是Xib或Storyboard的问题,那么尝试使用所有outlet的自动调整大小和原点设置来修复它的位置并查看差异。这可能对你有用。

enter image description here


那并不能解决问题。此外,我知道如何解决这个问题(将其他子视图放在表格之前),我想知道的是为什么会出现这种情况。 - Stonz2

0
UITableView的表头只能包含一个UIView,所以如果你需要同时有UISearchBar和UILabel,你需要将它们包裹在一个UIView中,并将此视图添加为UITableView的表头。

标签不在表视图上,而是直接放在主视图上。 - Stonz2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接