在导航控制器中默认隐藏UITableViewsearch栏

我已经阅读了多篇文章,但对我来说这不正常。 我正在使用最新的4.2 SDK。

我有的代码是

self.tableView.contentOffset = CGPointMake(0.0, 44.0); 

这部分工作,它将search栏上移一点点,但不会完全隐藏。 我已经尝试增加价值44更大的东西,这并没有影响甚么! 我在表的视图控制器的viewDidLoad方法中调用此代码。 有没有人有任何想法?

另一种方法应该是…在viewDidLoad调用:

 self.tableView.contentInset = UIEdgeInsetsMake(-self.searchDisplayController.searchBar.frame.size.height, 0, 0, 0); 

并实现endDragging委托方法:

 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ CGPoint offset = self.tableView.contentOffset; CGFloat barHeight = self.searchDisplayController.searchBar.frame.size.height; if (offset.y <= barHeight/2.0f) { self.tableView.contentInset = UIEdgeInsetsZero; } else { self.tableView.contentInset = UIEdgeInsetsMake(-barHeight, 0, 0, 0); } self.tableView.contentOffset = offset; } 

设置内容是去除一些“闪烁”

如果你想让search栏粘在顶部,执行didScroll这样:

 -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ CGRect sbFrame = self.searchDisplayController.searchBar.frame; sbFrame.origin.y = self.tableView.contentOffset.y; if (sbFrame.origin.y > 0) { sbFrame.origin.y = 0; } self.searchDisplayController.searchBar.frame = sbFrame; } 

我希望这会有所帮助(花了我几天的时间弄清楚:))

干杯!

更新:

作为@carbonr指出你应该添加这一行viewDidLoad自iOS7 +

 self.edgesForExtendedLayout = UIRectEdgeNone; 
 self.tableView.contentOffset = CGPointMake(0.0, 44.0); 

上面的代码实际上工作,但它需要在UITableView完成所有单元的创build之后运行。 我想这是另一个问题,但。

您可以在viewDidLoad设置表视图的初始界限,所以search栏显示为隐藏在开始处。

您必须创buildsearchBar属性,然后使用以下代码:

 - (void)viewDidLoad { //... CGRect bounds = self.tableView.bounds; bounds.origin.y = self.tableView.bounds.origin.y + searchBar.bounds.size.height; self.tableView.bounds = bounds; //... } 

对于其他人仍在寻找更新的解决scheme,你可以在这里查看我的答案。

基本上你需要在第一次调用viewDidLayoutSubviews更新contentOffset

我也有像你一样的问题。 下面的代码解决了我的问题。请在viewDidLoad()中添加代码:

 self.edgesForExtendedLayout = UIRectEdgeNone; 

N:B:我在我的项目中使用了autoLayout。