活动时,UISearchController搜索栏与第一个单元重叠

时间:2017-07-05 15:01:01

标签: ios objective-c iphone uitableview

我正在使用UISearchController在我的tableview中搜索数据。我没有使用表视图控制器。我想在搜索栏处于活动状态时隐藏导航栏,因此我将self.searchController.hidesNavigationBarDuringPresentation = YES;设置为是。

但是当我这样做并想要搜索时,我的主动搜索栏会覆盖第一个单元格的一部分。被覆盖的部分与状态栏具有相同的高度。

status bar active

我尝试了与此类似的其他文章和问题,但没有任何帮助我解决它。然后我开始玩表视图标题大小。我这样做了

 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

  return 20.0f;
}

结果是,当我点击搜索栏时,开始搜索问题就不再存在了。

search controller with header size 20

然而,当搜索栏未激活时,搜索栏和第一个单元格之间存在瞎扯

enter image description here

有任何想法如何解决这个问题?

修改:添加self.automaticallyAdjustsScrollViewInsets = false;

enter image description here

7 个答案:

答案 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

}