it-swarm.com.ru

Как центрировать текст местозаполнителя в UISearchBar iOS 11

В iOS 11 панели поиска по умолчанию соответствуют тексту, выровненному по левому краю. Хотя это выглядит хорошо с остальными нативными изменениями в iOS, оно не совсем соответствует моему дизайну, и я бы хотел, чтобы он был в центре, как это было раньше.

Я не могу найти такие атрибуты выравнивания на UISearchBar. Я что-то упустил, или это просто невозможно? Нужно ли создавать собственную панель поиска, например, полученную из переменной UITextField?

12
Sti

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

Ниже работает для меня (Swift):

let placeholderWidth = 200 // Replace with whatever value works for your placeholder text
var offset = UIOffset()

override func viewDidLoad() {
    offset = UIOffset(horizontal: (searchBar.frame.width - placeholderWidth) / 2, vertical: 0)
    searchBar.setPositionAdjustment(offset, for: .search)
}

func searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
    let noOffset = UIOffset(horizontal: 0, vertical: 0)
    searchBar.setPositionAdjustment(noOffset, for: .search)

    return true
}


func searchBarShouldEndEditing(_ searchBar: UISearchBar) -> Bool {
    searchBar.setPositionAdjustment(offset, for: .search)

    return true
}
7
user6219797

Это немного обходной путь.

Прежде всего вам нужно получить текстовое поле панели поиска и центрировать выравнивание текста:

let textFieldOfSearchBar = searchController.searchBar.value(forKey: "searchField") as? UITextField textFieldOfSearchBar?.textAlignment = .center

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

func presentSearchController(_ searchController: UISearchController) {
    //Is active
    let width: CGFloat = 100.0 //Calcualte a suitable width based on search bar width, screen size, etc..

    let textfieldOfSearchBar = searchController.searchBar.value(forKey: "searchField") as? UITextField

    let paddingView = UIView(x: 0, y: 0, w: width, h: searchController.searchBar.frame.size.height)
    textfieldOfSearchBar?.leftView = paddingView
    textfieldOfSearchBar?.leftViewMode = .unlessEditing
}

func willDismissSearchController(_ searchController: UISearchController) {
    let textfieldOfSearchBar = searchController.searchBar.value(forKey: "searchField") as? UITextField
    textfieldOfSearchBar?.leftView = nil
}

Удачи

4
RJiryes

Нет официального способа сделать это. Попробуйте использовать методы UISearchBarDelegate и свой собственный UILabel.

extension YourViewController: UISearchBarDelegate {
    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        placeholderLabel.isHidden = true
    }

    func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
        placeholderLabel.isHidden = false
    }
}

Не забудьте скрыть стандартный значок с выравниванием по левому краю (используйте пустое изображение):

    searchBar.setImage(UIImage.imageWithColor(.clear), for: .search, state: .normal)
1
SoftDesigner

let placeHolderOffSet = UIOffset (горизонтальный: 100, вертикальный: 0) setPositionAdjustment (placeHolderOffSet, для: .search)

если вам нужна другая позиция, когда панель активна, вам придется сбросить ее в соответствующем методе делегата

0
KVTaniguchi

Для Swift 4.0+

Ну, так как ваш вопрос на самом деле не указывает только заполнитель, я дам ответ как заполнителю, так и тексту. В моем проекте мне нужно было, чтобы оба текста центрировались всегда, а не только тогда, когда я не редактировал текстовое поле. Вы можете вернуть его по левому краю с некоторыми ответами в этом посте, используя делегата, как они заявили.

Также я не использую SearchController, но есть выход SearchBar, в любом случае это может быть легко исправлено для вашего проекта, если вы используете контроллер. (просто замените searchController.searchBar вместо только searchBar).

Так что просто нужно вызвать следующую функцию там, где она вам нужна.

func searchBarCenterInit(){
    if let searchBarTextField = searchBar.value(forKey: "searchField") as? UITextField {

        //Center search text
        searchBarTextField.textAlignment = .center

        //Center placeholder
        let width = searchBar.frame.width / 2 - (searchBarTextField.attributedPlaceholder?.size().width)!
        let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: width, height: searchBar.frame.height))
        searchBarTextField.leftView = paddingView
        searchBarTextField.leftViewMode = .unlessEditing
    }
}
0
rheligon