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

Dar*_*ong 6 iphone objective-c ios

我已经阅读过多篇帖子,但它对我来说不起作用.我正在使用最新的4.2 SDK.

我的代码是

self.tableView.contentOffset = CGPointMake(0.0, 44.0);
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*lik 24

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

self.tableView.contentInset = UIEdgeInsetsMake(-self.searchDisplayController.searchBar.frame.size.height, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

并实现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;
}
Run Code Online (Sandbox Code Playgroud)

设置内容是删除一些"闪烁"

如果您希望搜索栏保持在顶部,请以这种方式实现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;
}
Run Code Online (Sandbox Code Playgroud)

我希望这会有所帮助(花了几天时间弄明白:))

干杯!

更新:

正如@carbonr所说,你应该在iOS7 +以后的viewDidLoad中添加这一行

self.edgesForExtendedLayout = UIRectEdgeNone;
Run Code Online (Sandbox Code Playgroud)

  • 代码将在iOS 7上出现意外行为并修复您需要将其添加到`viewDidLoad`.这是一个新的API`self.edgesForExtendedLayout = UIRectEdgeNone;` (3认同)

Dar*_*ong 14

self.tableView.contentOffset = CGPointMake(0.0, 44.0);
Run Code Online (Sandbox Code Playgroud)

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