UITearchBar上的UITableView奇怪的偏移问题

时间:2014-06-20 20:52:43

标签: ios objective-c uitableview uisearchbar

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

表的搜索栏和内容偏移量非常奇怪,但它似乎取决于这些视图添加到xib中主视图的顺序。我创建了一个示例项目,只有我的表/搜索和标签才能测试,结果是一样的。当标签后添加表格时,一切正常:

设定:

table added after label

正确和预期的结果:

Proper expected result

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

显然设置错误:

Table added before label

搜索栏的奇怪偏移:

wtf is this?!?!

我没有改变任何其他内容,为什么Xcode似乎关心这些子视图添加到主视图的顺序?如果我向上滚动“坏”表设置,搜索栏会立即在其顶部边缘消失,但表的内容将继续向上滚动,直到它到达xib中设置的帧的顶部。向下滚动,搜索栏不会重新出现,直到奇怪的降低位置。这是在Xcode 5.1.1中,而不是新的测试版。无论是否启用了Autolayout,结果都是相同的。

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

4 个答案:

答案 0 :(得分:14)

这是因为UIViewController的属性名为automaticallyAdjustsScrollViewInsets

  

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

来自Big Nerd Ranch

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

以下是apple documentation的说明:

  

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

答案 1 :(得分:1)

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

如果您没有为此编写代码,并且只是xib或storyboard的问题,请尝试所有outlet的自动调整和原点设置来修复其位置并查看差异。它可能对你有用。

enter image description here

答案 2 :(得分:0)

UITableView标头只能包含一个UIView,因此如果您需要UISearchBar和UILabel,则需要将它们包装到UIView中并将此视图添加为UITableView标头。

答案 3 :(得分:0)

更新:ios 11中已弃用void NewWindow::on_combobox_New_currentIndexChanged(int index) //slot function { QWidget* box = new QWidget(); box->setWindowModality(Qt::ApplicationModal); box->setWindowTitle("Wait..."); QHBoxLayout* layout = new QHBoxLayout(); box->setLayout(layout); QLabel* lbl = new QLabel(); lbl->setText("Loading..."); layout->addWidget(lbl); box->show(); QCoreApplication::processEvents(); // cause the box to be displayed for (int var = 0; var < st.size(); ++var) { //Some heavy lifting here // if you do anything here to change the widget, such as // updating a progress bar, you need to `processEvents` again QCoreApplication::processEvents(); } box->close(); } ,并且已引入新字段automaticallyAdjustsScrollViewInsets

contentInsetAdjustmentBehavior