ios - 如何从样式分组的 TableView 中删除多余的空间?

标签 ios swift xcode

是的,我已经从其他类似的问题中尝试过这些,但它们不起作用:

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tableView.tableHeaderView = UIView(frame: frame)

self.automaticallyAdjustsScrollViewInsets = false;         
definesPresentationContext = true

看看我试图删除搜索栏下方的额外空间:

Screenshot

也许您可以指出我的代码中的改进:

import UIKit

class SelectCountryViewController: UITableViewController, UISearchBarDelegate, UISearchResultsUpdating {

    struct CellStruct
    {
        var countryName : String
        var countryFlag : String
        var countryDialCode :   String
    }

    var cellDatas = [CellStruct]()

    var filteredCellDatas = [CellStruct]()

    var searchController : UISearchController!
    var resultsController = UITableViewController()
    var refreshController = UIRefreshControl()
    var searchTextField : UITextField!

    var searchLoaded = false
    var isSearching = false

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.delegate = self;

        var frame = CGRect.zero
        frame.size.height = .leastNormalMagnitude
        tableView.tableHeaderView = UIView(frame: frame)
        self.automaticallyAdjustsScrollViewInsets = false;
        //tableView.separatorStyle = UITableViewCellSeparatorStyle.singleLine
        definesPresentationContext = true

        configureSearchController()

        let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(cancel))
        navigationItem.leftBarButtonItem = cancelButton
        //self.navigationItem.title = "Select Country"
        let searchButton: UIBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: self, action: #selector(searchButtonAction))
        searchButton.image = UIImage(named: "search")
        self.navigationItem.rightBarButtonItem = searchButton

        refreshController.attributedTitle = NSAttributedString(string: "")
        refreshController.addTarget(self, action: #selector(refreshSelector), for: .valueChanged)
        tableView.addSubview(refreshController)



        guard let path = Bundle.main.path(forResource: "countries", ofType: "json")
            else
        {
            return
        }
        let url = URL(fileURLWithPath: path)
        do
        {
            let data = try Data (contentsOf: url)
            let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
            print(json)
            guard let array = json as? [Any] else { return}
            for info in array {
                guard let userDict = info as? [String: Any] else { return}
                guard let code = userDict["code"] as? String else { print("No code found"); return}
                guard let dialCode = userDict["dial_code"] as? String else { print("No dial code found"); return}
                guard let name = userDict["name"] as? String else { print("No name found"); return}
                print("We have: ", code, dialCode, name)
                cellDatas.append(CellStruct(countryName: name, countryFlag: code, countryDialCode: dialCode))
            }
        }
        catch
        {
            print(error)
        }




    }
    func configureSearchController()
    {

        resultsController.tableView.delegate = self
        resultsController.tableView.dataSource = self

        self.searchController = UISearchController(searchResultsController: self.resultsController)
        //self.tableView.tableHeaderView = self.searchController.searchBar
        self.searchController.searchResultsUpdater = self

        self.searchController.dimsBackgroundDuringPresentation = false
        searchController.searchBar.delegate = self
        self.searchController.searchBar.scopeButtonTitles = []

        for subView in searchController.searchBar.subviews {
            for subViewOne in subView.subviews {
                if subViewOne is UITextField {
                    searchTextField = subViewOne as! UITextField
                    subViewOne.backgroundColor = UIColor.white
                    break
                }
            }
        }

        self.automaticallyAdjustsScrollViewInsets = false;
        extendedLayoutIncludesOpaqueBars = true
        definesPresentationContext = true

    }
    func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
     //   tableView.setContentOffset(self.navigationItem, animated: true)
        searchController.searchBar.barTintColor = UIColor.white
        //searchController.searchBar.layer.borderColor = UIColor.white.cgColor
      searchTextField.backgroundColor = UIColor.searchBarTextFieldGrey()
        return true
    }
    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
        self.searchController.searchBar.showsCancelButton = false
    //    searchController.searchBar.barTintColor = nil
        searchTextField.backgroundColor = UIColor.white
       searchController.searchBar.barTintColor = nil


    }

    override func viewWillDisappear(_ animated: Bool) {
        self.navigationController?.navigationBar.shadowImage = nil
        self.navigationController?.navigationBar.backIndicatorImage = nil
    }

    func updateSearchResults(for searchController: UISearchController) {
        //tableView.separatorStyle = UITableViewCellSeparatorStyle.none

        if searchController.searchBar.text! == "" {
            filteredCellDatas = cellDatas
        } else {
            // Filter the results
            filteredCellDatas = cellDatas.filter { $0.countryName.lowercased().contains(searchController.searchBar.text!.lowercased()) }
        }
        resultsController.tableView.reloadData()
//        tableView.separatorStyle = .none
//        tableView.separatorStyle = UITableViewCellSeparatorStyle.singleLine

    }


    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if tableView == resultsController.tableView
        {
            isSearching = true
            return filteredCellDatas.count
        }
        else
        {
            isSearching = false
            return cellDatas.count
        }
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
         var cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
        cell?.separatorInset.left = 15
        if cell == nil {
            cell = UITableViewCell(style: .value1, reuseIdentifier: "Cell")

            cell?.separatorInset.left = 0
        }

        if tableView == resultsController.tableView
        {
            cell?.textLabel?.text = filteredCellDatas[indexPath.row].countryName
            cell?.detailTextLabel?.text = filteredCellDatas[indexPath.row].countryDialCode
            cell?.imageView?.image = UIImage (named: filteredCellDatas[indexPath.row].countryFlag)

        }
        else
        {
            cell?.textLabel?.text = cellDatas[indexPath.row].countryName
            cell?.detailTextLabel?.text = cellDatas[indexPath.row].countryDialCode

            cell?.imageView?.image = UIImage (named: cellDatas[indexPath.row].countryFlag)
        }

        cell?.textLabel?.textColor = UIColor.labelGray2()
        cell?.detailTextLabel?.textColor = UIColor.labelGray2()
        cell?.textLabel?.font = UIFont(name:"SF Pro Text", size:15)
        cell?.detailTextLabel?.font = UIFont(name:"SF Pro Text", size:15)


        return cell!

    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print(indexPath.row, indexPath.section)
        // let currentCell = tableView.cellForRow(at: indexPath)
        if(isSearching)
        {
            print(filteredCellDatas[indexPath.row].countryFlag)
            UserDefaults.standard.set(filteredCellDatas[indexPath.row].countryFlag, forKey: "preferredCountry")

            if searchController.isActive {
                DispatchQueue.main.async {
                    self.searchController.dismiss(animated: true, completion: {
                        self.performSegue(withIdentifier: "unWindFromSelectCountry", sender: nil)
                    })
                }
            } else {
                // Play segue, dismiss or pop ...
                self.performSegue(withIdentifier: "unWindFromSelectCountry", sender: nil)

            }

        }
        else
        {
            print(cellDatas[indexPath.row].countryFlag)
            UserDefaults.standard.set(cellDatas[indexPath.row].countryFlag, forKey: "preferredCountry")
            self.performSegue(withIdentifier: "unWindFromSelectCountry", sender: nil)
        }

    }
    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        if section == 0 {
            return CGFloat.leastNormalMagnitude
        }
        return tableView.sectionHeaderHeight
    }

    @objc func cancel(){
        navigationController?.popViewController(animated: true)
    }


    @objc func refreshSelector()
    {
        if(!searchLoaded)
        {
            searchLoaded = true

           self.tableView.tableHeaderView = searchController.searchBar
            print( "Got ya")
        }
        refreshController.endRefreshing()

    }

    @objc func searchButtonAction() {

        if(!searchLoaded)
        {
            searchLoaded = true
            self.tableView.tableHeaderView = searchController.searchBar
         //   self.navigationItem.titleView = searchController.searchBar
        }

        self.searchController.searchBar.becomeFirstResponder()
        self.searchController.searchBar.text = ""
      //  self.navigationItem.rightBarButtonItem = nil


    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }



}

如上所述, TableView 是分组样式的。我正在从代码配置搜索栏。因此,使用同一 TableView 中的代码更新结果。 提前致谢

最佳答案

也许它不是一个tableHeaderView我认为它可能是特定的Section HeaderView尝试这样:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return CGFloat.leastNormalMagnitude
    }
    return tableView.sectionHeaderHeight
}

代码隐藏表格中第一部分的标题

关于ios - 如何从样式分组的 TableView 中删除多余的空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52136951/

相关文章:

ios - Flurry IOS 崩溃并带有附加日志

ios - 在 iOS 中为多个设备和不同方向启动屏幕 Storyboard

ios - 在数组中的对象上使用过滤器来查找最大值? [ swift ]

c++ - 由于 ____chkstk_darwin,在 Catalina 上使用 Deployment 10.10 编译的 MacOS 应用程序在 < HighSierra 版本上崩溃

iphone - 段控制背景色

ios - 如何向已有的 Storyboard添加后退按钮和导航栏?

ios - sectionForSectionIndexTitle 检索上一节

ios - 如何在 Swift 的第一个 ViewController 中隐藏导航栏?

Xcode 6.3 不支持 iOS 9

ios - 如何使用 Facebook iOS SDK 管理生产和开发凭证