Как изменить цвет фона текстового поля в UISearchController? - PullRequest
0 голосов
/ 13 декабря 2018

Как изменить серый фон по умолчанию в текстовом поле поиска UISearchController?

Screen shot

Ответы [ 9 ]

0 голосов
/ 21 декабря 2018

Нет никакого правильного / публичного способа изменить цвет фона этой панели поиска.Есть несколько способов использования частного API, например, ответ @sanjayshah, но в этом случае есть вероятность, что Apple может отклонить ваше приложение.Я думаю, что вы должны двигаться дальше, используя цвет фона по умолчанию.Большинство приложений используют то же самое.

0 голосов
/ 11 августа 2019

Рекурсивная версия ответа @ Kamran с лучшим вариантом и средним временем выполнения.Принятая версия не работает на iOS 13+ для меня.

private lazy var searchTextField: UITextField? = { [unowned self] in
    guard let searchBar = self.searchController?.searchBar else { return nil }
    var views =  searchBar.subviews
    while !views.isEmpty {
        guard let view = views.popLast() else { break }
        if let textfield = view as? UITextField {
            return textfield
        }
        views += view.subviews
    }
    return nil
}()
0 голосов
/ 20 декабря 2018

У Apple есть ключ 'searchField' для обнаружения текстового поля в строке поиска.Поэтому сначала смело возьмите это текстовое поле и сделайте все, что вы хотите, с помощью текстового поля.

let searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.searchBar.placeholder = "Search here..."
searchController.searchBar.delegate = self
searchController.searchBar.tintColor = .white
searchController.searchBar.barTintColor = .white
searchController.hidesNavigationBarDuringPresentation = false
searchController.obscuresBackgroundDuringPresentation = false

if let textfield = searchController.searchBar.value(forKey: "searchField") as? UITextField {

    // Set text colour of text field   
    textfield.textColor = UIColor.blue

    if let backgroundview = textfield.subviews.first {

        // Get background view and change background color
        backgroundview.backgroundColor = UIColor.white

        // Set rounded corner
        backgroundview.layer.cornerRadius = 10
        backgroundview.clipsToBounds = true
    }
}

if #available(iOS 11.0, *) {
    self.navigationItem.searchController = searchController
} else {
    self.tblCustomers.tableHeaderView = searchController.searchBar
}

Это рабочий код, который я реализовал в своем текущем проекте.Тем не менее, если у вас есть какие-либо вопросы, дайте мне знать.

Я надеюсь, что это поможет вам.

0 голосов
/ 20 декабря 2018

Макс. Используйте эту функцию для изменения цвета.

extension UISearchBar {
func setBackgroundColor(){
    if let view:UIView = self.subviews.first {
        for curr in view.subviews {
            guard let searchBarBackgroundClass = NSClassFromString("UISearchBarBackground") else {
                return
            }
            if curr.isKind(of:searchBarBackgroundClass){
                if let imageView = curr as? UIImageView{
                    imageView.backgroundColor = .red
                    break
                }
            }
        }
    }
}
}

Используйте эту функцию с поисковой строкой .

searchBarController.searchBar.setBackgroundColor()
0 голосов
/ 19 декабря 2018

Я делаю это таким образом, код Objective-C:

UITextField *searchField = [_navigationSearchBar valueForKey:@"searchField"];
searchField.backgroundColor = [UIColor defaultSeacrhBarColor];
searchField.textColor = [UIColor defaultWhiteColor];
searchField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:searchTitle];
UILabel *placeholderLabel = [searchField valueForKey:@"placeholderLabel"];
placeholderLabel.textColor = [UIColor lightTextColor];

UIButton *clearButton = [searchField valueForKey:@"clearButton"];
[clearButton setImage:[clearButton.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate] forState:UIControlStateNormal];
clearButton.tintColor = [UIColor defaultWhiteColor];

_navigationSearchBar.delegate = self;
[_navigationSearchBar setTranslucent:NO];
[_navigationSearchBar setBackgroundImage:nil];
[_navigationSearchBar setBarTintColor:[UIColor defaultNavigationBarColor]];
[_navigationSearchBar setBackgroundColor:[UIColor defaultNavigationBarColor]];
[_navigationSearchBar setImage:[UIImage imageNamed:@"Search_Icon"] forSearchBarIcon:UISearchBarIconSearch state:UIControlStateNormal];
_navigationSearchBar.clipsToBounds = YES;
[_navigationBar addSubview:_navigationSearchBar];
0 голосов
/ 18 декабря 2018

Чтобы обновить фон UISearchController, нужно изменить фоновое изображение.

Если вы видите UISearchController в визуальном отладчике, вы можете узнать, что его фон - UIImageView:

enter image description here

Так что вы должны сделать маленькийизображение панели поиска и установите его на seachBar следующим образом:

    lazy var searchController: UISearchController = {

        let searchController = UISearchController(searchResultsController: nil)

        searchController.searchBar.placeholder = "Search"
        searchController.searchBar.tintColor = UIColor.black
        searchController.searchBar.searchBarStyle = .minimal
        // Set background image to searchBar so it will resize
        searchController.searchBar.setSearchFieldBackgroundImage(UIImage(named: "oval_static"), for: .normal)

        definesPresentationContext = true

        return searchController
    }()

Изображение searchBar (в проекте я рекомендую использовать формат изображения .pdf или .png, просто скриншот):

enter image description here

UISearchBar изменит его по мере необходимости, и в результате:

enter image description here

Более тогомы можем сделать что-то вроде этого, чтобы создать собственный фон только в коде:

/// Just random extension to make image from UIView, you can use your own
extension UIView {

func asImage() -> UIImage {
    let renderer = UIGraphicsImageRenderer(bounds: bounds)
    return renderer.image { rendererContext in
        layer.render(in: rendererContext.cgContext)
    }
}}

lazy var searchController: UISearchController = {

        let searchController = UISearchController(searchResultsController: nil)

        searchController.searchBar.placeholder = "Search"
        searchController.searchBar.tintColor = UIColor.black
        searchController.searchBar.searchBarStyle = .minimal

        // Create own view with custom properties
        // Default height is 36 points
        let differentColorSearchBar = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 36))

        differentColorSearchBar.layer.cornerRadius = 8
        differentColorSearchBar.clipsToBounds = true
        differentColorSearchBar.backgroundColor = UIColor.blue

        searchController.searchBar.setSearchFieldBackgroundImage(differentColorSearchBar.asImage(), for: .normal)

        definesPresentationContext = true

        return searchController
    }

Результатом является (конечно, вы можете изменить другие свойства searchBar, чтобы сделать его лучше, но я просто покажу вам, как правильно изменить фон):

enter image description here

Я рекомендую избегать частных владений, просто используйте open!Надеюсь, это поможет.

0 голосов
/ 16 декабря 2018

Вот пример того, как установить фон textField.

class ViewController: UIViewController {

    let searchController = UISearchController(searchResultsController: nil)

    private lazy var searchTextField: UITextField? = { [unowned self] in
        var textField: UITextField?
        self.searchController.searchBar.subviews.forEach({ view in
            view.subviews.forEach({ view in
                if let view  = view as? UITextField {
                    textField = view
                }
            })
        })
        return textField
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = "Search Candies"
        navigationItem.searchController = searchController
        definesPresentationContext = true

        if let bg = self.searchTextField?.subviews.first {
            bg.backgroundColor = .green
            bg.layer.cornerRadius = 10
            bg.clipsToBounds = true
        }
    }
}

Результат

enter image description here

0 голосов
/ 15 декабря 2018

Просто сделайте следующее:

searchController.searchBar.barTintColor = UIColor("Your color")
0 голосов
/ 13 декабря 2018

Вы пробовали что-то вроде

searchController.searchBar.backgroundColor = UIColor.blue
...