2016-12-06 135 views
1

問題的空間是這樣的:奇怪的問題,我UISearchController

必須有searchbarnavbar之間的空間:

There has space between searchbar and navbar

而在Debug in Hierarchy

該表查看

enter image description here

的包裝查看,我們可以看到空間(20 PIX)

The wrapper View

而在storyboard,我的限制設置爲tableView,注意了:navigationBar由自己draged ,本地人被我藏起來了。

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() 
    } 


} 

嘗試 - 1

當我uncheck的​​,第一次來到這個vc,這個問題是不存在的,但如果我點擊searchBar,這個問題會回來的,我懷疑我的代碼,如果是某個錯誤:

The issue exist


嘗試 - 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

+0

哥你使用默認的導航控制器? –

+0

@Himanshu Moradiya,是的,但'navigationBar'是我自己製作的。因爲我認爲這樣做可以方便地編輯'navigationBar',默認的'navigationBar'被我隱藏了。 – aircraft

+0

是否在編輯更改時在編碼中設置了tableview和searchbar的框架? ? –

回答

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

因爲我不知道你限制你的意見如何。我想這個問題是由於automaticallyAdjustsScrollViewInsets。您應該在ViewControllerautomaticallyAdjustsScrollViewInsets = false。或者您應該將您的UITableView限制爲View.Top而不是TopLayoutGuide.Bottom

+0

我已經測試了取消勾選故事板中的AdjustsScrollViewInsets,但是仍然存在問題,請檢查我的編輯 - 1' – aircraft

+0

知道如何限制導航欄會很棒。 –

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

@aircraft your tableview top constrain = 0; ? –

+0

@aircraft是否更新了輸出結果gif文件,其常量= 44 –

+0

。您可以看到我的'Debug in Hierarchy:'picture,at there,'tableView'的底部視圖沒問題,頂部到'navigationBar''但是'searchbar'的位置是偏移的,不是以'wrapperView'頂部開始的。 – aircraft