UISearchController搜索栏宽度不变

时间:2015-08-30 04:56:41

标签: ios swift ios8

通过搜索栏的快速教程,并发现我可以使用searchBar.sizeToFit()自动调整搜索栏,但搜索栏的右端仍然会延伸到屏幕之外。

class MainViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating, UISearchBarDelegate {

     var searchController = UISearchController(searchResultsController: nil)
     override func viewDidLoad() {
         super.viewDidLoad()
         searchController.searchBar.delegate = self
         searchController.searchResultsUpdater = self
         searchController.dimsBackgroundDuringPresentation = false
         searchController.searchBar.sizeToFit()
         tableView.tableHeaderView = searchController.searchBar
         definesPresentationContext = true
    }}

我尝试用searchController.searchBar.frame = CGRectMake(0, 0, 200, 200)之类的东西手动设置框架,但宽度仍然偏离屏幕。故事板中不存在搜索栏,但tableView不存在。

5 个答案:

答案 0 :(得分:2)

如果您正在使用自动布局,则使用前沿和后沿而不是宽度约束。

答案 1 :(得分:1)

需要为搜索栏所属的tableView设置自动布局约束。设置这些修复了尺寸问题。

答案 2 :(得分:0)

     只需单击下面给出的Pin选项并选择顶部,前导(左)和尾(右)约束,然后单击Add 3 constraints。确保未选中“约束到边距”复选框。如果约束满足,则不会有警告。尝试更改搜索栏的背景颜色,以查看其在屏幕上的位置。

答案 3 :(得分:0)

如果设置自动布局限制并不能解决问题,请尝试在searchController.searchBar.sizeToFit()而不是viewWillLayoutSubviews()中调用viewDidLoad()。如果搜索栏包含在表标题视图以外的视图中,这可能会有所帮助。

答案 4 :(得分:0)

Swift 4,适用于所有类型的ViewController

经过无数小时的反复试验,这就是我想为那些希望在代码中使用它的人准备的东西:

  1. 设置代表

    SearchDatasourceController类:UIViewController,UISearchBarDelegate {}

  2. 设置一个customTitleView和searchBar

重要提示:设置框架

lazy var customTitleView: UIView = {
    var view = UIView()
    let frame = CGRect(x: 0, y: 0, width: 300, height: 44)
    view.frame = frame
    return view
  }()

  lazy var searchBar: UISearchBar = {
    let searchBar = UISearchBar()
    searchBar.placeholder = "Search"
    searchBar.autocapitalizationType = .none
    searchBar.backgroundImage = UIImage()
    (searchBar.value(forKey: "searchField") as? UITextField)?.backgroundColor = UIColor(r: 230, g: 230, b: 230)
    searchBar.delegate = self
    searchBar.becomeFirstResponder()
    let frame = CGRect(x: 0, y: 0, width: 300, height: 44)
    searchBar.frame = frame
    return searchBar
  }()
  1. 在viewDidLoad中添加用于保存searchBar的customTitleView

    覆盖func viewDidLoad(){     super.viewDidLoad()

    customTitleView.addSubview(searchBar)
    navigationItem.titleView = customTitleView
    searchBar.becomeFirstResponder()
    

    }

  2. 添加委托方法以侦听搜索结果

    func searchBar(_ searchBar:UISearchBar,textDidChange searchText:String){     打印(searchText)   }

  3. 确保将您的视图控制器显示在导航堆栈上

    func handleSearchBarButtonItemTapped(){     让控制器= SearchDatasourceController()     navigationController?.pushViewController(控制器,动画:true)   }