每次点击取消button时,search栏会跳下一行

我已经实现了一个UISearchBar来search外部API中的项目目录。 searchfunction按预期工作,但问题是,每次按下search栏文本字段右侧的取消button,整个search栏向下移动一行,看起来像是推动整个表视图也是如此。

因此,如果我在search栏文本字段中input一个字母,然后按取消,search栏文本字段向下移动44px,这是行高度,并且表视图本身也被按下相同的数量。 如果我连续按input的东西,然后按取消,search栏将进一步向下移动视图。 任何build议将是伟大的! 这是我的代码:

import Foundation import UIKit import ItemLogger private extension Selector { static let dismiss = #selector(SearchVC.dismissView) } extension SearchVC: UISearchResultsUpdating { func updateSearchResultsForSearchController(searchController: UISearchController) { let searchBar = searchController.searchBar let scope = searchBar.scopeButtonTitles![searchBar.selectedScopeButtonIndex] filterContentForSearchText(searchController.searchBar.text!, scope: scope) } } extension SearchVC: UISearchBarDelegate { func searchBar(searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { filterContentForSearchText(searchBar.text!, scope: searchBar.scopeButtonTitles![selectedScope]) } } class SearchVC: UITableViewController { let searchController = UISearchController(searchResultsController: nil) var searchedItems = [ItemLog]() var searchedImages = [UIImage]() override func viewDidLoad() { super.viewDidLoad() let leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "Back_Button"), style: UIBarButtonItemStyle.Plain, target: self, action: .dismiss) self.navigationItem.leftBarButtonItem = leftBarButtonItem } override func viewWillAppear(animated: Bool) { configureSearchController() } override func prefersStatusBarHidden() -> Bool { return true } func configureSearchController() { guard !searchController.active else { return } searchController.searchResultsUpdater = self searchController.dimsBackgroundDuringPresentation = false searchController.searchBar.placeholder = "Type to Search" definesPresentationContext = true searchController.searchBar.scopeButtonTitles = ["All"] searchController.searchBar.delegate = self searchController.searchBar.sizeToFit() tableView.tableHeaderView = searchController.searchBar let view: UIView = self.searchController.searchBar.subviews[0] as UIView for subView: UIView in view.subviews { if let textView = subView as? UITextField { textView.tintColor = UIColor.orangeColor() textView.textColor = UIColor.blackColor() textView.backgroundColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.05) } } searchController.searchBar.barTintColor = UIColor.whiteColor() let cancelButtonAttributes: NSDictionary = [NSForegroundColorAttributeName: UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.33)] UIBarButtonItem.appearance().setTitleTextAttributes(cancelButtonAttributes as? [String : AnyObject], forState: UIControlState.Normal) } func searchBarTextDidBeginEditing(searchBar: UISearchBar) { tableView.reloadData() } override func tableView(tableView:UITableView, numberOfRowsInSection section: Int) -> Int { if searchController.active && searchController.searchBar.text != "" { return searchedItems.count } return 0 } override func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = self.tableView.dequeueReusableCellWithIdentifier("items", forIndexPath: indexPath) let label = cell.viewWithTag(111) as! UILabel let nameLabel = cell.viewWithTag(222) as! UILabel let art = cell.viewWithTag(333) as! UIImageView if searchController.active && searchController.searchBar.text != "" && searchController.searchBar.text != NSCharacterSet.whitespaceCharacterSet(){ label.text = searchedItems[indexPath.row].title nameLabel.text = searchedItems[indexPath.row].name art.image = searchedImages[indexPath.row] } return cell } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { print(searchedItems[indexPath.row]) self.tableView.deselectRowAtIndexPath(indexPath, animated: true) } func filterContentForSearchText(searchText: String, scope: String = "All") { if searchController.active && searchController.searchBar.text != "" && searchController.searchBar.text != NSCharacterSet.whitespaceCharacterSet() { let queries: [SearchQueryOptions] = [ .QueryString(searchController.searchBar.text!)] ItemLog.search(queries, completion: { (result) in if let itms = result.response.result where itms.count > 0 { self.searchedItems.removeAll() self.searchedImages.removeAll() for i in 0...itms.count - 1 { self.searchedItems.append(itms[i]) self.searchedImages.append(itms[i].img) } } self.tableView.reloadData() }) } } func dismissView(){ self.navigationController?.popToRootViewControllerAnimated(true) } } 

代码在Swift 3中testing。

注意:什么时候,我尝试你的代码。 我面临同样的问题。 不知何故,我设法绕过…

 class SearchVC: UITableViewController,UISearchBarDelegate,UISearchResultUpdating { var resultSearchController = UISearchController() override func viewDidLoad() { super.viewDidLoad() configureSearchController() } override var prefersStatusBarHidden: Bool { return true } func configureSearchController() { self.resultSearchController = ({ let controller = UISearchController(searchResultsController: nil) controller.searchResultsUpdater = self controller.dimsBackgroundDuringPresentation = false controller.hidesNavigationBarDuringPresentation = false controller.searchBar.searchBarStyle = .default controller.searchBar.sizeToFit() controller.searchBar.setShowsCancelButton(false, animated: true) controller.searchBar.keyboardAppearance = .default self.tableView.tableHeaderView = controller.searchBar //controller.searchBar.tintColor = UIColor(patternImage: UIImage(named: "xxxx")!) // controller.searchBar.setBackgroundImage(UIImage(named: "xxxx"), forBarPosition: UIBarPosition.Top, barMetrics: UIBarMetrics.Default) // controller.searchBar.backgroundImage = UIImage(named: "xxxx") // controller.searchBar.setImage(UIImage(named: "search-icon.png"), forSearchBarIcon: UISearchBarIcon.Search, state: UIControlState.Normal) return controller })() for subView in self.resultSearchController.searchBar.subviews { for subsubView in subView.subviews { if let textField = subsubView as? UITextField { textField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Search Text", comment: ""), attributes: [NSForegroundColorAttributeName: UIColor.red]) textField.adjustsFontSizeToFitWidth = true textField.allowsEditingTextAttributes = true textField.textColor = UIColor.red textField.layer.borderColor = UIColor.gray.cgColor textField.layer.cornerRadius = 5 textField.layer.masksToBounds = true textField.layer.borderWidth = 0.215 } } } } } 

更新:

  func updateSearchResults(for searchController: UISearchController) {} 

从上面的code..hope输出,我的答案将解决您的问题…. 在这里输入图像说明

尝试在viewDidLoad调用configureSearchController() 。 不要忘了在viewWillAppear调用super.viewWillAppear(animated:)

我做了一个开源项目SearchTableView

 self.searchController.searchBar.sizeToFit() self.tableHeaderView = self.searchController.searchBar searchTableView.layoutMargins = UIEdgeInsets.zero definesPresentationContext = true extendedLayoutIncludesOpaqueBars = true