UISearchController 搜索栏在活动时与第一个单元格重叠
Posted
技术标签:
【中文标题】UISearchController 搜索栏在活动时与第一个单元格重叠【英文标题】:UISearchController search bar overlap first cell when active 【发布时间】:2017-07-05 15:01:01 【问题描述】:我正在使用UISearchController
在我的表格视图中搜索数据。我没有使用表格视图控制器。我想在搜索栏处于活动状态时隐藏导航栏,因此我将self.searchController.hidesNavigationBarDuringPresentation = YES;
设置为是。
但是,当我这样做并想要搜索时,我的活动搜索栏会覆盖第一个单元格的一部分。被覆盖的部分与状态栏的高度相同。
我尝试了与此类似的其他文章和问题,但没有任何帮助我解决它。然后我开始使用表格视图标题大小。我这样做了
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
return 20.0f;
结果是,当我点击搜索栏时,开始搜索问题不再存在。
但是,当搜索栏未激活时,搜索栏和第一个单元格之间存在间隙
任何想法如何解决这个问题?
编辑:添加self.automaticallyAdjustsScrollViewInsets = false;
后
【问题讨论】:
尝试在 viewDidLoad 中添加 self.automaticallyAdjustsScrollViewInsets = false 它从顶部隐藏了状态栏,但第一个单元格仍然被覆盖。 这很奇怪,应该不会影响状态栏的可见性。 【参考方案1】:我设法通过将 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)];
【讨论】:
那是因为(我认为)您的搜索栏始终可见。一些实现建议在需要之前将其隐藏起来。在 viewdidload 中设置它时,您可能希望这样做。将移至下面的单独帖子。 为我工作,没有 setContentOffset 部分。【参考方案2】:这就是我在 viewDidLoad 中设置搜索栏和内容的方式(复制自苹果的一些示例)。
它在显示未过滤数据的同一视图控制器中显示找到的结果。它还在表格标题中具有隐藏的搜索栏,直到需要它。
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, the 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)];
【讨论】:
要求:navigationItem.searchController = searchController,不要为我解决问题。【参考方案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)
这样,当空白不活动时,您将避免空白。
【讨论】:
这对我没有帮助 @beowulf 你是如何实现它的? 我确实将内容插入到 willPresentSearchController 中,并在 willDismissSearchController 中删除了它 然后呢?是不是把tableView的内容往下推了?究竟是什么问题?否则,任何人都很难在不提供更多细节的情况下“提供帮助”。 :-) 它没有把它往下推。看起来和第一张图片一样。只有在手动滚动表格视图后,我才能看到 contentInset。【参考方案4】:不是最好的解决方案,只是解决方法。
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
return searchController.isActive ? 20.0f : 0.0f;
【讨论】:
【参考方案5】:我见过类似的行为。很可能,您的表视图控制器没有实现 heightForHeaderInSection。单元格的精确高度未知,这会导致像您这样的问题。
【讨论】:
我有两种方法来实现标题视图的高度和单元格的实现。【参考方案6】:在解除 searchController 后重置 tableView.tableHeaderView = searchController.searchBar
为我解决了这个问题。
public func didDismissSearchController(_ searchController: UISearchController)
tableView.tableHeaderView = searchController.searchBar
不幸的是,如果您选择结果并返回父视图控制器,didDismissSearchController
不会被调用。
在这种情况下,您需要将 searchBar.frame 重置回原点位置:
if let frame = tableView.tableHeaderView?.frame
searchController.searchBar.frame = frame
【讨论】:
【参考方案7】:我也有同样的烦恼。研究没有回答。我的决定:
1) 我将 UITableviewController 与 SearchController 一起使用,当我在该字段上录制时,我遇到了这个 UI 问题: Extra blank space between searchBar and tableview 这些家伙指出,您需要将 searchController 与 UIViewcontroller 和 tableView 分开使用。 所以我做到了
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()
在添加约束的方法中,重要的是附加到top&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
【讨论】:
以上是关于UISearchController 搜索栏在活动时与第一个单元格重叠的主要内容,如果未能解决你的问题,请参考以下文章
UISearchController 搜索栏在出现时向下移动
在 iOS 13 中使用 UISearchController 时,状态栏在 iOS 中变为白色
UISearchBar 在活动时与 UITableView 内容重叠