使用UISearchBar时UITableView contentSize错误

时间:2014-01-21 14:21:13

标签: ios ios7 uisearchbar uitableview

使用UITableView时,

contentSize报告的UISearchBar比预期的要大。对于零单元,预期的内容高度将为零。相反,以下代码在运行iOS 7的iPhone 4英寸中输出612。

@implementation HPViewController {
    UITableView *_tableView;
    UISearchBar *_searchBar;
    UISearchDisplayController *_searchController;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    _tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    _tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.view addSubview:_tableView];

    _searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];

    _searchController = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self];
    _searchController.delegate = self;
    _searchController.searchResultsDataSource = self;
    _tableView.tableHeaderView = _searchBar;
}

- (void)viewDidLayoutSubviews
{
    CGSize contentSize = _tableView.contentSize;
    NSLog(@"%f", contentSize.height); // 612.000000
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 0; }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { return nil; };

@end

注释设置标题视图的行会使代码输出为0,如预期的那样。

此外,如果我指定一个空的UIView作为标题,则contentSize将是正确的并且与标题的高度相匹配。问题只发生在UISearchBar

这有什么办法吗?我做错了吗?

3 个答案:

答案 0 :(得分:5)

UISearchBar置于容器UIView内主要解决问题。

- (void)viewDidLoad
{
    [super viewDidLoad];
    _tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    _tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.view addSubview:_tableView];

    UIView *searchBarContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    _searchBar = [[UISearchBar alloc] initWithFrame:searchBarContainer.bounds];
    [searchBarContainer addSubview:_searchBar];

    _searchController = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self];
    _searchController.delegate = self;
    _searchController.searchResultsDataSource = self;
    _tableView.tableHeaderView = searchBarContainer;
}

不幸的是UISearchBar在一些我无法隔离的情况下出现故障。我选择通过添加所有单元格的高度来手动计算contentSize

答案 1 :(得分:1)

从iOS11开始,UITableView默认使用估计行/页眉/页脚高度来计算初始contentSize。实际上,如果您点击搜索栏并关闭键盘,则内容大小将具有正确的值。

要解决此问题,请将IB中的估算行,页眉和页脚高度设置为0,而不是自动设置:

enter image description here

或者只是通过编程方式完成:

self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionHeaderHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;

答案 2 :(得分:-1)

添加此委托方法

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    return [[UIView alloc] initWithFrame:CGRectZero];
}

也许你的页脚视图正在缩小,因为没有要显示的单元格。