默认情况下,在导航控制器中隐藏UITableView搜索栏

时间:2010-11-25 01:07:54

标签: iphone objective-c ios

我已经阅读过多篇帖子,但这对我来说并不合适。我正在使用最新的4.2 SDK。

我的代码是

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

这部分有效,它会将搜索栏向上移动一点,但它不会完全隐藏。我已经尝试将值44增加到更高的值,这对以前没有任何影响!我在表的视图控制器的viewDidLoad方法中调用此代码。有没有人有任何想法?

5 个答案:

答案 0 :(得分:24)

另一种方法应该是...在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;
}

设置内容是为了删除一些“闪烁”

如果您希望搜索栏贴在顶部,请以这种方式实现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所说,你应该在iOS7 +

之后的viewDidLoad中添加这一行
self.edgesForExtendedLayout = UIRectEdgeNone;

答案 1 :(得分:14)

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

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

答案 2 :(得分:4)

您可以在viewDidLoad内设置表格视图的初始范围,这样搜索栏就会隐藏在开头。

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

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

答案 3 :(得分:0)

对于仍在寻找更新解决方案的其他人,您可以查看我在here上的回答。

基本上,您需要在第一次调用contentOffset时更新viewDidLayoutSubviews

答案 4 :(得分:-1)

我也遇到和你一样的问题。以下代码解决了我的问题。请在viewDidLoad()中添加代码:

self.edgesForExtendedLayout = UIRectEdgeNone;

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