Сохранить поля для UISearchBar - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь создать UISearchController и поместить его панель поиска в представление контейнера. searchView это розетка. Вот мой код:

    let searchController = UISearchController(searchResultsController: nil)
    self.searchController = searchController

    let searchBarBackground = UIImage.roundedImage(UIImage.image(with: #colorLiteral(red: 0.5568627451, green: 0.5568627451, blue: 0.5764705882, alpha: 0.2), size: size), cornerRadius: cornerRadius)
    searchController.searchBar.setSearchFieldBackgroundImage(searchBarBackground, for: .normal)
    searchController.searchBar.searchTextPositionAdjustment = UIOffsetMake(8.0, 0.0)
    searchController.searchBar.searchBarStyle = .minimal
    searchController.searchBar.barStyle = .black
    searchController.searchBar.delegate = self

    searchView.addSubview(searchController.searchBar)

Я не могу понять, как сделать панель поиска, чтобы сохранить поля из основного вида. Когда я пытаюсь добавить ограничения к представлению контейнера и добавить панель поиска в качестве подпредставления, панель поиска не учитывает конечные ограничения.

enter image description here

Даже ручная настройка рамки панели поиска, равная границам просмотра контента в viewDidLayoutSubviews, не помогает. Это выглядит нормально только тогда, когда я устанавливаю начальные и конечные ограничения на 0 без учета полей суперпредставления. Но у него только 8pt полей с боков, мне нужно больше.

enter image description here

Как мне этого добиться? Может быть, можно изменить поле по умолчанию для панели поиска? Благодаря.

Снимок экрана из IB, если необходимо (это просто ограничения для поля со значением -8 для компенсации внутренних полей панели поиска):

enter image description here

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Я получил следующее решение: обновлять рамку панели поиска после каждого представления и закрытия поискового контроллера и в viewDidAppear(_:) для начальной настройки.

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController?.searchBar.frame.size.width = searchView.bounds.width
}

func didPresentSearchController(_ searchController: UISearchController) {
    searchController.searchBar.frame.size.width = self.searchView.bounds.width
}

func didDismissSearchController(_ searchController: UISearchController) {
    searchController.searchBar.frame.size.width = self.searchView.bounds.width
}
0 голосов
/ 03 сентября 2018

Проблема заключается в том, что вы создаете представление программно и используете маску авторазмера.

https://developer.apple.com/documentation/uikit/uiview/1622572-translatesautoresizingmaskintoco

По умолчанию это свойство имеет значение true для любого представления, создаваемого вами программно.

Пример для простого UISearchBar:

class ViewController: UIViewController, UISearchBarDelegate {

    weak var searchBar: UISearchBar?

    override func viewDidLoad() {
        super.viewDidLoad()

        let searchBar = UISearchBar(frame: .zero)
        self.searchBar = searchBar
        searchBar.searchBarStyle = .minimal
        searchBar.barStyle = .black
        searchBar.delegate = self
        searchBar.translatesAutoresizingMaskIntoConstraints = false

        view.addSubview(searchBar)
        NSLayoutConstraint.activate([
            searchBar.topAnchor.constraint(equalTo: view.topAnchor, constant: 50.0),
            searchBar.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 40.0),
            view.trailingAnchor.constraint(equalTo: searchBar.trailingAnchor, constant: 40.0),
        searchBar.heightAnchor.constraint(equalToConstant: 36.0)
            ])
    }
}
...