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

时间:2016-12-06 09:26:35

标签: ios constraints uisearchcontroller

问题是这样的:

searchbarnavbar之间有空格:

  

There has space between searchbar and navbar

Debug in Hierarchy

表格视图

enter image description here

包装器View,我们可以看到空间(20像素)

The wrapper View

storyboard中,我将约束设置为tableView,注意:navigationBar由我自己驱散,本机被我隐藏。

And in the storyboard, I set the constraint to the 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.配置
    self.resultSearchController = UISearchController(searchResultsController: nil)
    self.resultSearchController.searchResultsUpdater = self
    self.resultSearchController.dimsBackgroundDuringPresentation = false
    self.resultSearchController.searchBar.sizeToFit()
    self.resultSearchController.searchBar.placeholder = "搜索"
    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: "网络异常")
        })

    }

    // 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

        // 配置cell
        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()
    }


}

ATTEMPT - 1

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

  

The issue exist

ATTEMPT - 2

如果我尝试以下代码:

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {

    for item:NSLayoutConstraint in self.navbar.constraints {

        if item.firstAttribute == NSLayoutAttribute.height {

            item.constant = 44 // before is 64.
        }
    }

}
  

The issue

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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.
        }
    }
}

答案 2 :(得分:0)

经过多次尝试:

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
}