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
。
这有什么办法吗?我做错了吗?
答案 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,而不是自动设置:
或者只是通过编程方式完成:
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];
}
也许你的页脚视图正在缩小,因为没有要显示的单元格。