奇怪的问题,我的UISearchController的空间

问题是这样的:

searchnavbarnavbar之间有空格:

搜索栏和导航栏之间有空格

在“ Debug in Hierarchy中的Debug in Hierarchy

表视图

在这里输入图像说明

包装视图,我们可以看到空间(20 pix)

包装视图

storyboard ,我将约束条件设置为tableView ,注意: navigationBar是由我自己绘制的,本地人是由我隐藏的。

在故事板中,我将约束设置为tableView


我的代码

 import UIKit import SVProgressHUD class StoreListViewController: UIViewController, UISearchBarDelegate, UITableViewDelegate,UITableViewDataSource, UISearchResultsUpdating { @IBOutlet weak var navbar: UINavigationBar! @IBOutlet weak var tableView: UITableView! var ori_dataSource: [StoreListModel] = [StoreListModel]() var dataSource = [String]() var filterdDataSource = [String]() var resultSearchController = UISearchController() var choosedStore:StoreListModel? = nil override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. initData() initUI() } // MARK: - init func initData() { // 1.configurationself.resultSearchController = UISearchController(searchResultsController: nil) self.resultSearchController.searchResultsUpdater = self self.resultSearchController.dimsBackgroundDuringPresentation = false self.resultSearchController.searchBar.sizeToFit() self.resultSearchController.searchBar.placeholder = "search" self.resultSearchController.searchBar.tintColor = UIColor.black self.resultSearchController.searchBar.delegate = self self.tableView.tableHeaderView = self.resultSearchController.searchBar let nib = UINib(nibName: "TerantListCell", bundle: nil) // Required if our subclasses are to use: dequeueReusableCellWithIdentifier:forIndexPath: //tableView.register(nib, forCellReuseIdentifier: "TerantListCell") self.tableView.register(nib, forCellReuseIdentifier: "TerantListCell") self.tableView.tableFooterView = UIView.init() self.tableView.reloadData() networkForStoreList() } func initUI() { // 1.隐藏cell下的Line tableView.separatorStyle = UITableViewCellSeparatorStyle.none } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destinationViewController. // Pass the selected object to the new view controller. if segue.identifier == "StoreListGotoStoreDetailVC" { let detail_vc:StoreDetailVC = segue.destination as! StoreDetailVC detail_vc.store_info = self.choosedStore } } // MARK: - delegate func searchBarCancelButtonClicked() { for item:NSLayoutConstraint in self.tableView.constraints { if item.firstAttribute == NSLayoutAttribute.top { item.constant = 0 } } } // MARK: - searchbar delegate func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { searchBar.setValue("取消", forKey:"_cancelButtonText") for item:NSLayoutConstraint in self.navbar.constraints { if item.firstAttribute == NSLayoutAttribute.height { item.constant = 0 } } } func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { for item:NSLayoutConstraint in self.navbar.constraints { if item.firstAttribute == NSLayoutAttribute.height { item.constant = 64 } } } // MARK: - private methods // MARK: - actions // MARK: - unwind @IBAction func unwindToStoreListVCFromStoreDetailVC(segue: UIStoryboardSegue) { } // MARK: - network func networkForStoreList() { let userStatic: UserStaticSwift = UserStaticSwift.sharedInstance() let params:[String:String] = [ "createTime":"-1", "userId" : userStatic.userId // 商户id ] // url_listUsers Mysevers.afpost(withHud: true, andAddressname: Global.url_listStore, parmas: params, requestSuccess: { (result) in let stateCode = UtilSwift.getNetStateCode(result: result as Any, key: Global.net_key_stateCode) if stateCode == 0 { let userArr:[[String : Any]] = UtilSwift.getNetAnyObject(result: result as Any, key: "list") as! [[String : Any]] // Global.net_key_bussiness 后台写错了//self.ori_dataSource = terantArr for item:[String: Any] in userArr { let store_list_model: StoreListModel = StoreListModel.initStoreListModelWithDic(dic: item) self.ori_dataSource.append(store_list_model) } for item:StoreListModel in self.ori_dataSource { self.dataSource.append(item.name) } self.tableView.reloadData() // 刷新tableView }else if stateCode == -1 { // 弹窗系统错误SVProgressHUD.showError(withStatus: "系统错误") } }, failBlcok: { // 弹窗系统错误SVProgressHUD.showError(withStatus: "networkingexception") }) } // MARK: - tableView func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if self.resultSearchController.isActive { return filterdDataSource.count }else { return dataSource.count } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell: TerantListCell = tableView.dequeueReusableCell(withIdentifier: "TerantListCell", for: indexPath) as! TerantListCell // configurationcell if self.resultSearchController.isActive { cell.title_label.text = self.filterdDataSource[indexPath.row] }else { cell.title_label?.text = self.dataSource[indexPath.row] } return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { self.choosedStore = self.ori_dataSource[indexPath.row] tableView.deselectRow(at: indexPath, animated: true) self.performSegue(withIdentifier: "StoreListGotoStoreDetailVC", sender: self) } // MARK: - 正则func updateSearchResults(for searchController: UISearchController) { self.filterdDataSource.removeAll(keepingCapacity: false) let searchPredicate = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!) let array = (self.dataSource as NSArray).filtered(using: searchPredicate) self.filterdDataSource = array as! [String] self.tableView.reloadData() } } 

尝试 – 1

当我uncheck Adjust Scroll View Insets ,首先进入vc ,问题是不存在的,但如果我点击searchBar ,问题会再次出现,我怀疑我的代码,如果是某处错误:

这个问题存在


试用 – 2

如果我尝试下面的代码:

 func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { for item:NSLayoutConstraint in self.navbar.constraints { if item.firstAttribute == NSLayoutAttribute.height { item.constant = 44 // before is 64. } } } 

问题

因为我不知道你如何限制你的观点。 我想这个问题是由于automaticallyAdjustsScrollViewInsets 。 你应该automaticallyAdjustsScrollViewInsets = false你的ViewController automaticallyAdjustsScrollViewInsets = false 。 或者你应该限制你的UITableView View.Top而不是TopLayoutGuide.Bottom

 func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { for item:NSLayoutConstraint in self.navbar.constraints { if item.firstAttribute == NSLayoutAttribute.height { item.constant = 44 // changes this one line and check it if any problem then put comment below. } } } 

经过多次尝试:

 func searchBarCancelButtonClicked(_ searchBar: UISearchBar) { for item:NSLayoutConstraint in self.navbar.constraints { if item.firstAttribute == NSLayoutAttribute.height { item.constant = 64 } } // set this help me! :) tableView.contentInset = UIEdgeInsets.zero tableView.scrollIndicatorInsets = UIEdgeInsets.zero }