我正在使用UISearchController
在我的tableview中搜索数据。我没有使用表视图控制器。我想在搜索栏处于活动状态时隐藏导航栏,因此我将self.searchController.hidesNavigationBarDuringPresentation = YES;
设置为是。
但是当我这样做并想要搜索时,我的主动搜索栏会覆盖第一个单元格的一部分。被覆盖的部分与状态栏具有相同的高度。
我尝试了与此类似的其他文章和问题,但没有任何帮助我解决它。然后我开始玩表视图标题大小。我这样做了
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 20.0f;
}
结果是,当我点击搜索栏时,开始搜索问题就不再存在了。
然而,当搜索栏未激活时,搜索栏和第一个单元格之间存在瞎扯
有任何想法如何解决这个问题?
修改:添加self.automaticallyAdjustsScrollViewInsets = false;
答案 0 :(得分:6)
我设法通过将RJiryes的答案与向上滚动相结合来解决这个问题。
-(void)willPresentSearchController:(UISearchController *)searchController{
[self.contactsTableView setContentInset:UIEdgeInsetsMake(20, 0, 0, 0)];
[self.contactsTableView setContentOffset:CGPointMake(0.0f, -self.contactsTableView.contentInset.top) animated:YES];
}
-(void)willDismissSearchController:(UISearchController *)searchController{
[self.contactsTableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
}
答案 1 :(得分:3)
您可以从顶部添加内容插件,而不是添加标题。
self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)
当调用willDismissSearchController(UISearchController'委托方法)时,将insets返回0
self.tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
这样,当你的空白无效时,你就会避开空白。
答案 2 :(得分:2)
这就是我在viewDidLoad中设置搜索栏和内容的方法(复制了一些苹果公司的例子)。
它在同一个viewcontroller中显示找到的结果,因为显示了未过滤的数据。它还在表头中有一个搜索栏,隐藏到需要之前。
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
// we want to be the delegate for our filtered table so didSelectRowAtIndexPath is called for both tables
self.searchController.delegate = self;
self.searchController.dimsBackgroundDuringPresentation = NO; // default is YES
self.searchController.searchBar.delegate = self; // so we can monitor text changes + others
// Search is now just presenting a view controller. As such, normal view controller
// presentation semantics apply. Namely that presentation will walk up the view controller
// hierarchy until it finds the root view controller or one that defines a presentation context.
//
self.definesPresentationContext = YES; // know where you want UISearchController to be displayed
// Hides search bar initially. When the user pulls down on the list, the search bar is revealed.
[self.tableView setContentOffset:CGPointMake(0, self.searchController.searchBar.frame.size.height)];
答案 3 :(得分:0)
不是最佳解决方案,只是解决方法。
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return searchController.isActive ? 20.0f : 0.0f;
}
答案 4 :(得分:0)
我见过类似的行为。最有可能的是,您的表视图控制器没有实现heightForHeaderInSection。细胞的精确高度尚不清楚,这会导致像你这样的问题。
答案 5 :(得分:0)
在解雇searchController解决了我的问题后重新设置2
。
tableView.tableHeaderView = searchController.searchBar
如果您选择结果并返回到父viewController,则不会调用 public func didDismissSearchController(_ searchController: UISearchController) {
tableView.tableHeaderView = searchController.searchBar
}
。
在这种情况下,您需要将searchBar.frame重置回原点位置:
didDismissSearchController
答案 6 :(得分:-1)
我遇到同样的麻烦。研究没有回答。我的决定:
1)我使用了带有SearchController的UITableviewController,当我在该字段上录音时,我遇到了这个UI问题: Extra blank space between searchBar and tableview 这些人指出你需要分别使用带有UIViewcontroller和tableView的searchController。 所以我做了
2)出现了这个问题。它解决如下:
let searchController = UISearchController(searchResultsController: nil)
var tableView:UITableView!
override func viewDidLoad() {
super.viewDidLoad()
loadData()
setupTableView()
setupSearchController()
}
private func setupTableView(){
tableView = UITableView(frame: CGRect.zero, style: .plain)
**//next 2 very important line of code**
tableView.autoresizingMask = UIViewAutoresizing()
tableView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(tableView)
tableView.dataSource = self
tableView.delegate = self
tableView.register(LetterBrandCell.self, forCellReuseIdentifier: "brandCell")
tableView.tableFooterView = UIView()
addConstraints()
}
在添加约束的方法中,重要的是要附加到顶部& bottomLayoutGuides,而不仅仅是查看:
private func addConstraints(){
NSLayoutConstraint(item: tableView,
attribute: .top,
relatedBy: .equal,
toItem: topLayoutGuide,
attribute: .bottom,
multiplier: 1,
constant: 0).isActive = true
NSLayoutConstraint(item: tableView,
attribute: .bottom,
relatedBy: .equal,
toItem: bottomLayoutGuide,
attribute: .top,
multiplier: 1,
constant: 0).isActive = true
NSLayoutConstraint(item: view,
attribute: .leading,
relatedBy: .equal,
toItem: tableView,
attribute: .leading,
multiplier: 1,
constant: 0).isActive = true
NSLayoutConstraint(item: view,
attribute: .trailing,
relatedBy: .equal,
toItem: tableView,
attribute: .trailing,
multiplier: 1,
constant: 0).isActive = true
}